<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Alchemy | Blog</title><description/><link>https://alchemy.run/</link><language>en</language><atom:link rel="self" href="https://alchemy.run/blog/rss.xml"/><atom:link rel="prev-archive" href="https://alchemy.run/blog/rss/2026-08.xml"/><item><title>2.0.0-beta.78 - Git Hosting, Stripe &amp; Worker Previews</title><link>https://alchemy.run/blog/2026-09-17-beta-78/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-09-17-beta-78/</guid><description>v2.0.0-beta.78 ships alchemy/Git, an embeddable, pluggable git server you mount in your own Effect HTTP API, plus a Stripe provider, Worker Previews, ten new GitHub resources, an alchemy dev that uses half the memory, and a round of drift and default-handling fixes across RDS, S3, and security groups.</description><pubDate>Thu, 17 Sep 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.78 ships &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Git&lt;/code&gt;&lt;/strong&gt;, an embeddable, pluggable git server
built from Effect Layers. Mount it inside any Effect HTTP API and
pick where refs and bytes live — Durable Objects and R2 on
Cloudflare, S3 and Lambda on AWS, or a store of your own. A new
&lt;strong&gt;Stripe&lt;/strong&gt; provider provisions Stripe resources and binds them to
your Workers and Functions. &lt;strong&gt;Worker Previews&lt;/strong&gt; give every branch its
own URL and isolated Durable Objects. The GitHub provider gains ten
resources, &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs on half the memory, and a round of
fixes to RDS, S3, and security groups repairs drift and restores
defaults when props are removed.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-rc.115&lt;/code&gt; is the new minimum peer&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1562&quot;&gt;#1562&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1601&quot;&gt;#1601&lt;/a&gt;). rc.113
renamed the &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Flag&lt;/code&gt; constructors to PascalCase — see
&lt;a href=&quot;#effect-rc115&quot;&gt;below&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;SecurityGroup&lt;/code&gt; &lt;code dir=&quot;auto&quot;&gt;egress: []&lt;/code&gt; now means no outbound traffic&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1623&quot;&gt;#1623&lt;/a&gt;). It
used to fall back to AWS’s allow-all default, the same as omitting
&lt;code dir=&quot;auto&quot;&gt;egress&lt;/code&gt;. Omit the prop to keep the default. Rules that exist in
AWS but not in your program are now removed on the next deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1592&quot;&gt;#1592&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1664&quot;&gt;#1664&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;SecurityGroupRule&lt;/code&gt; resources in the same stack are preserved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RDS parameter groups reset undeclared overrides&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1589&quot;&gt;#1589&lt;/a&gt;). An
omitted &lt;code dir=&quot;auto&quot;&gt;parameters&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;{}&lt;/code&gt;: values edited in the console converge
back to engine defaults.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Alchemist&lt;/code&gt; leaves the root barrel&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1614&quot;&gt;#1614&lt;/a&gt;) so that
importing &lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt; no longer loads every cloud:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Alchemist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Alchemist&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;S3BucketEventSource&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Server&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;S3BucketEventSource&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Server/S3BucketEventSource&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Prisma.Database&lt;/code&gt; branch props are no longer nullable&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1582&quot;&gt;#1582&lt;/a&gt;) —
Prisma’s API now attaches every database to a Branch. Omit both
&lt;code dir=&quot;auto&quot;&gt;branchId&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;branchGitName&lt;/code&gt; to use the project default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Test.make&lt;/code&gt; defaults to stage &lt;code dir=&quot;auto&quot;&gt;test_$USER&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1579&quot;&gt;#1579&lt;/a&gt;),
matching &lt;code dir=&quot;auto&quot;&gt;live_$USER&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;dev_$USER&lt;/code&gt;. Pass &lt;code dir=&quot;auto&quot;&gt;stage&lt;/code&gt; to keep &lt;code dir=&quot;auto&quot;&gt;test&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-rc115&quot;&gt;effect rc.115&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;alchemy now requires effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-rc.115&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1562&quot;&gt;#1562&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1601&quot;&gt;#1601&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;effect@rc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-bun@rc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-node@rc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;rc.113 renamed the &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Flag&lt;/code&gt; constructors to PascalCase:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;HOST&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;HOST&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mapOrFail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mapEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Flag&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;yes&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Flag&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;yes&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Flag&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;choice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;backend&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; …)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Flag&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Literals&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;backend&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; …)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;rc.113 also replaced &lt;code dir=&quot;auto&quot;&gt;@effect/sql-pg&lt;/code&gt;’s &lt;code dir=&quot;auto&quot;&gt;pg&lt;/code&gt; dependency with a native
wire client, which sent no SNI and rejected &lt;code dir=&quot;auto&quot;&gt;sslmode=prefer&lt;/code&gt;. Both
broke Aurora DSQL, Neon, and local Hyperdrive; alchemy’s
&lt;code dir=&quot;auto&quot;&gt;SQL.Postgres&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Drizzle.Postgres&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;postgresState&lt;/code&gt; now derive the
TLS config from the URL
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1580&quot;&gt;#1580&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1582&quot;&gt;#1582&lt;/a&gt;), and rc.115
fixes the SNI half upstream
(&lt;a href=&quot;https://github.com/Effect-TS/effect/pull/8174&quot;&gt;Effect-TS/effect#8174&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;an-embeddable-pluggable-git-server&quot;&gt;An embeddable, pluggable Git server&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Git&lt;/code&gt; is a pluggable, embeddable git server
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1187&quot;&gt;#1187&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1621&quot;&gt;#1621&lt;/a&gt;). It speaks
smart HTTP to any &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; client, serves a typed REST plane with pull
requests, and answers the GitHub REST v3 API so &lt;code dir=&quot;auto&quot;&gt;gh api&lt;/code&gt; and Octokit
work against it unchanged. Nothing ships a Worker — every part is an
Effect service with swappable Layers, assembled into a Worker you own:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Git&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Http&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Http&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;GitObjects&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiLive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiHandlersLive&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// the engine&apos;s route handlers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt;.layer)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// yours: who may call what&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReposDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;// refs, objects, pull requests&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RegistryDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// owner/name → repo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HasherInline&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;// push verification&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BlobStoreR2&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// packs, bundles, large pushes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Git&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GIT_WORKER_OPTIONS&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpRouter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHttpEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;GitLive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Http&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Platform&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each line is one decision with its own implementations. Change a
line and only that decision changes — here the bytes move to S3:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;GitObjects&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;GitObjects&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiLive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiHandlersLive&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt;.layer)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReposDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RegistryDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HasherInline&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BlobStoreR2&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BlobStoreS3&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;embedded-by-design&quot;&gt;Embedded by design&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;You build the HTTP server and mount &lt;code dir=&quot;auto&quot;&gt;alchemy/Git&lt;/code&gt;’s routes into it.
&lt;code dir=&quot;auto&quot;&gt;Git.Api&lt;/code&gt; is an Effect &lt;code dir=&quot;auto&quot;&gt;HttpApi&lt;/code&gt; group and &lt;code dir=&quot;auto&quot;&gt;Git.Handlers&lt;/code&gt; supplies
the default implementation of every route as a plain function. Add
the group to your own API and put your own &lt;code dir=&quot;auto&quot;&gt;HttpApiMiddleware&lt;/code&gt; in
front of it, and every request — &lt;code dir=&quot;auto&quot;&gt;git clone&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;git push&lt;/code&gt;, the REST
API, and the GitHub-compatible API &lt;code dir=&quot;auto&quot;&gt;gh&lt;/code&gt; uses — goes through your
authentication and your user management. The engine itself holds no
users, no credentials, and no policy.&lt;/p&gt;
&lt;p&gt;The middleware is native &lt;code dir=&quot;auto&quot;&gt;HttpApiMiddleware&lt;/code&gt;. Declare what it
provides, add the Git groups to your API, and put it in front:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpApiMiddleware&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;provides&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CurrentUser&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;app/Authentication&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { error&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Unauthorized&lt;/span&gt;&lt;span&gt; }) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AppApi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpApi&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addHttpApi&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;)   &lt;/span&gt;&lt;span&gt;// repos, refs, objects, pulls, protocol, github&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AppRoutes&lt;/span&gt;&lt;span&gt;)        &lt;/span&gt;&lt;span&gt;// your own routes beside them&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;middleware&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Its implementation is an ordinary Layer — resolve a session cookie,
an API key, or the password &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; sends over HTTP Basic, and provide
&lt;code dir=&quot;auto&quot;&gt;CurrentUser&lt;/code&gt; to the endpoint. &lt;code dir=&quot;auto&quot;&gt;examples/cloudflare-git-service&lt;/code&gt; does
this with Better Auth.&lt;/p&gt;
&lt;p&gt;Because the handlers are yours to call, a route can be overridden
with a few lines of application code. Here &lt;code dir=&quot;auto&quot;&gt;receivePack&lt;/code&gt; reuses the
defaults for the read routes and wraps the push with a branch rule
that reads the &lt;code dir=&quot;auto&quot;&gt;CurrentUser&lt;/code&gt; the middleware provided:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ProtocolLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpApiBuilder&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;group&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AppApi&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (h) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Engine&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Handlers&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;handleRaw&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;infoRefs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;protocol&lt;/span&gt;&lt;span&gt;.infoRefs)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;handleRaw&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;uploadPack&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;protocol&lt;/span&gt;&lt;span&gt;.uploadPack)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;handleRaw&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;receivePack&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; ({ params&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; request }) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;repositories&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(params)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHttp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReceivePack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(request)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CurrentUser&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// provided by Authentication&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;updates&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;((u) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.ref &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;refs/heads/main&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;.id &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt;.owner)) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHttp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReceivePack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;reject&lt;/span&gt;&lt;span&gt;(push&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;only the owner moves main&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prepared&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;preparePush&lt;/span&gt;&lt;span&gt;(repo&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;.input)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHttp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReceivePack&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;(push&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;commitPush&lt;/span&gt;&lt;span&gt;(prepared))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;preparePush&lt;/code&gt; verifies the pack without moving refs; &lt;code dir=&quot;auto&quot;&gt;commitPush&lt;/code&gt;
moves them atomically. The same host runs behind a shared secret,
Better Auth, or anything else — the tutorial walks from one to the
other, ending with the full version of this handler in
&lt;a href=&quot;https://alchemy.run/git/tutorial/part-6&quot;&gt;Protect a branch&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;We benchmarked it against GitHub with real &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt; from the same
client and edge: a 36 MiB, 15.6k-object repository, a fresh
repository on each host.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Git&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;GitHub&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full &lt;code dir=&quot;auto&quot;&gt;git clone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0.7 s best, 1.3 s typical&lt;/td&gt;
&lt;td&gt;1.3 s best, 2.1 s typical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clone throughput&lt;/td&gt;
&lt;td&gt;80 MiB/s best, 33 MiB/s typical&lt;/td&gt;
&lt;td&gt;28 MiB/s best, 17 MiB/s typical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremental fetch&lt;/td&gt;
&lt;td&gt;0.4–0.6 s&lt;/td&gt;
&lt;td&gt;0.3–0.5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremental push&lt;/td&gt;
&lt;td&gt;0.2–0.4 s&lt;/td&gt;
&lt;td&gt;1.2 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44 MiB push, whole blobs&lt;/td&gt;
&lt;td&gt;4.8–6.4 s&lt;/td&gt;
&lt;td&gt;4.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40 MiB push, delta-heavy&lt;/td&gt;
&lt;td&gt;5.9–6.5 s&lt;/td&gt;
&lt;td&gt;3.3 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;GitHub’s throughput is the pack size divided by its clone time; the
incremental fetch is a &lt;code dir=&quot;auto&quot;&gt;git fetch&lt;/code&gt; with one new commit to pick up.
Clones are fast because the work is done ahead of time. After every
push the repository writes a ready-to-serve bundle to R2, and a
&lt;code dir=&quot;auto&quot;&gt;git clone&lt;/code&gt; is the Worker streaming that file to the client. The
Durable Object is not involved, so the number of concurrent clones a
repository can serve is limited by R2 and Workers, not by one object:
four clones at once reached 93 MiB/s aggregate. Everyday pushes,
which move a few commits, are faster than GitHub; incremental fetches
are about even. Large pushes are the one place GitHub is ahead. The
largest real push so far is the alchemy monorepo, 44k objects in a
67 MiB pack, hosted on &lt;a href=&quot;https://git.alchemy.run&quot;&gt;git.alchemy.run&lt;/a&gt;
and cloned back byte-identical under &lt;code dir=&quot;auto&quot;&gt;git fsck --strict&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;where-the-hashing-runs&quot;&gt;Where the hashing runs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Before a ref moves, every object in a push is inflated, SHA-1 hashed,
and delta-resolved. For a kilobyte push that is nothing; for a 40 MiB
push it is a lot of CPU, and Workers are a poor place for it. A
Worker’s CPU is slow for exactly this kind of work — tight loops over
bytes, inflate, and hashing run several times slower than on a
laptop — and there is one thread to run it on: a service binding call
executes on the caller’s thread, so fanning out to another Worker
buys nothing. The first version hashed on the request thread and took
10–13 seconds for the 40 MiB push:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HasherInline&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Git.Hasher&lt;/code&gt; is the Layer where a chunk gets hashed, so the fix was a
second implementation, not a change to the engine.
&lt;code dir=&quot;auto&quot;&gt;HasherWorkerLoader&lt;/code&gt; bundles the hasher as a module inside your
Worker and loads it into four fresh isolates per push, each with its
own 128 MB and its own thread. Nothing new is deployed, nothing
leaves Cloudflare, and the same push drops to 5.9–6.5 seconds:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHasher&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Git/Hasher&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiLive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ApiHandlersLive&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;span&gt;.layer)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReposDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RegistryDurableObject&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HasherInline&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GitHasher&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HasherWorkerLoader&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Git&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BlobStoreR2&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;GitObjects&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;HasherLambda&lt;/code&gt; is the third implementation — one Lambda invocation
per chunk, all at once, on a 3 GB function — for pushes wider than
four chunks when an AWS account is already in the stack. If a hasher
fails, the Worker hashes the chunk inline; a push never fails because
its hasher did. Incremental pushes take 0.2–0.4 s on every one of
them, so start with &lt;code dir=&quot;auto&quot;&gt;HasherInline&lt;/code&gt; and swap when large pushes start
to matter.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/git/recipes/scaling&quot;&gt;Scaling&lt;/a&gt; and &lt;a href=&quot;https://alchemy.run/git/blocks/hasher&quot;&gt;Hasher&lt;/a&gt;
have the full numbers; the design notes in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/packages/alchemy/src/Git/DESIGN.md&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;DESIGN.md&lt;/code&gt;&lt;/a&gt;
record every step of the sweep.&lt;/p&gt;
&lt;p&gt;It is a git remote you own, with an API, that you can build on — not
a GitHub replacement. No issues, reviews, or Actions.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/git&quot;&gt;Git&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/git/getting-started&quot;&gt;Getting Started&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/git/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/git/blocks&quot;&gt;Building blocks&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/git/recipes/scaling&quot;&gt;Scaling&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;stripe&quot;&gt;Stripe&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Stripe provider&lt;/strong&gt; for managing Stripe with alchemy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1298&quot;&gt;#1298&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;! It comes with resources
(&lt;code dir=&quot;auto&quot;&gt;Product&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Price&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Coupon&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;PromotionCode&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;PaymentLink&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;BillingPortalConfiguration&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;WebhookEndpoint&lt;/code&gt;, and Connect’s
&lt;code dir=&quot;auto&quot;&gt;Account&lt;/code&gt;), bindings for calling Stripe from a Worker
(&lt;code dir=&quot;auto&quot;&gt;CreateCustomer&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;CreateCheckoutSession&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Retrieve*&lt;/code&gt;, …) that
wire the API key into the Worker for you — each one registers the
permission it needs, so there is no key to copy into &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; — and
&lt;code dir=&quot;auto&quot;&gt;consumeEvents&lt;/code&gt;, an event source that provisions the webhook endpoint
from the Worker’s URL and hands your handler a typed event:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Pro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Pro&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Price&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ProMonthly&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;product&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;currency&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;usd&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;unitAmount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;recurring&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { interval&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;priceId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;price&lt;/span&gt;&lt;span&gt;.id&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCustomer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CreateCustomer&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCheckout&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CreateCheckoutSession&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeEvents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&quot;Events&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ events&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CheckoutSessionCompleted&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;InvoicePaymentFailed&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; (event) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.type)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCustomer&lt;/span&gt;&lt;span&gt;({ email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;a@example.com&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;createCheckout&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;subscription&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;customer&lt;/span&gt;&lt;span&gt;.id&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;line_items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ price&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;priceId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; quantity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;success_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.com/welcome&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cancel_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.com/pricing&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.orDie)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CreateCustomerHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CreateCheckoutSessionHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConsumeEventsLive&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;consumeEvents&lt;/code&gt; verifies signatures (a bad one is a 401) and creates
the &lt;code dir=&quot;auto&quot;&gt;WebhookEndpoint&lt;/code&gt; for you; declare one directly only when you own
the delivery URL.&lt;/p&gt;
&lt;p&gt;Two runnable examples: &lt;code dir=&quot;auto&quot;&gt;examples/stripe-billing&lt;/code&gt; (Checkout, Billing
Portal, and an entitlement record in KV kept current by webhooks) and
&lt;code dir=&quot;auto&quot;&gt;examples/stripe-connect&lt;/code&gt; (Express accounts, hosted onboarding, and
&lt;code dir=&quot;auto&quot;&gt;account.updated&lt;/code&gt; driving a D1 merchant table).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/stripe&quot;&gt;Stripe&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/stripe/guides/subscriptions&quot;&gt;Sell a subscription&lt;/a&gt;
· &lt;a href=&quot;https://alchemy.run/stripe/guides/connect&quot;&gt;Onboard merchants with Connect&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/stripe/guides/webhooks&quot;&gt;React to Stripe events&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;worker-previews&quot;&gt;Worker Previews&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;preview&lt;/code&gt; is the sibling of &lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1563&quot;&gt;#1563&lt;/a&gt;): a named
copy of another Worker with its own URL, its own bindings, and
isolated same-Worker Durable Objects. Production traffic is untouched.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { stage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;prod&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { of&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; parent }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// api.url → https://&amp;#x3C;stage&gt;-&amp;#x3C;worker&gt;.&amp;#x3C;account&gt;.workers.dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The Preview name defaults to the stack stage (&lt;code dir=&quot;auto&quot;&gt;pr-123&lt;/code&gt;). Destroying
the Preview Worker deletes the Preview; the parent stays up. Enable
&lt;code dir=&quot;auto&quot;&gt;domain: { name: &quot;app.example.com&quot;, previews: true }&lt;/code&gt; on the parent
and Previews serve at &lt;code dir=&quot;auto&quot;&gt;https://&amp;#x3C;preview-name&gt;.app.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;preview&lt;/span&gt;&lt;span&gt;.of          &lt;/span&gt;&lt;span&gt;// branch / PR — own URL, isolated DOs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;.parent      &lt;/span&gt;&lt;span&gt;// canary of another stage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;.traffic     &lt;/span&gt;&lt;span&gt;// gradual rollout of this Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;.traffic: &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// upload without routing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/previews&quot;&gt;Worker Previews&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;github-rulesets-protection-releases-and-more&quot;&gt;GitHub: rulesets, protection, releases, and more&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ten new resources on the GitHub provider.
&lt;a href=&quot;https://alchemy.run/providers/github/branchprotection&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;BranchProtection&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1514&quot;&gt;#1514&lt;/a&gt;) covers the
classic protection API — thanks
&lt;a href=&quot;https://github.com/99andytang&quot;&gt;99andytang&lt;/a&gt;! — and
&lt;a href=&quot;https://github.com/agustif&quot;&gt;Agusti F.&lt;/a&gt; contributed the other nine:
&lt;a href=&quot;https://alchemy.run/providers/github/ruleset&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Ruleset&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/label&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Label&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/milestone&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Milestone&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/issue&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Issue&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/pullrequest&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;PullRequest&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/release&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Release&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/collaborator&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Collaborator&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/providers/github/teamaccess&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;TeamAccess&lt;/code&gt;&lt;/a&gt;, and
&lt;a href=&quot;https://alchemy.run/providers/github/wikipage&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;WikiPage&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1565&quot;&gt;#1565&lt;/a&gt;–&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1578&quot;&gt;#1578&lt;/a&gt;).
Thanks both!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Ruleset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;main-protection&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-org&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repository&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;main protection&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;branch&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;conditions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;refs/heads/main&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;refs/heads/release/*&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nonFastForward&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deletion&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requiredLinearHistory&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pullRequest&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requiredApprovingReviewCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requireCodeOwnerReview&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dismissStaleReviewsOnPush&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TeamAccess&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;platform&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-org&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repository&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;teamSlug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;platform&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;permission&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;push&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/github&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-dev-runs-lighter&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs lighter&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; process tree drops from &lt;strong&gt;3.6 GB to 1.9 GB&lt;/strong&gt; on the
Vite example under Node, and a cold import of &lt;code dir=&quot;auto&quot;&gt;alchemy/Cloudflare&lt;/code&gt;
from 523 MB to 214 MB.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One sidecar, not one per provider group&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1613&quot;&gt;#1613&lt;/a&gt;). A
group is imported the first time a stack uses one of its types, so
a Cloudflare-only stack never loads the AWS emulator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Less engine in every process&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1614&quot;&gt;#1614&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;ProviderLayer.dual&lt;/code&gt; stops building its default variant at
registration, the CLI bins skip the &lt;code dir=&quot;auto&quot;&gt;alchemy/Cli&lt;/code&gt; barrel, and the
Cloudflare provider no longer imports all 122 distilled services
for one helper. Sidecar heap: 193 MB → 98 MB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transforms are cached on disk&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1615&quot;&gt;#1615&lt;/a&gt;). The
Oxc loader writes output to a per-user cache keyed by path, size,
mtime, and tsconfig instead of re-transpiling the source graph
(with inline source maps) in every Node process.
&lt;code dir=&quot;auto&quot;&gt;ALCHEMY_TRANSFORM_CACHE=0&lt;/code&gt; disables it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The workerd proxy is a &lt;code dir=&quot;auto&quot;&gt;node:net&lt;/code&gt; byte pipe&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1612&quot;&gt;#1612&lt;/a&gt;) instead
of a second workerd per Worker. HTTP/1.1, streaming, and WebSockets
pass through untouched; the Worker sees the real &lt;code dir=&quot;auto&quot;&gt;Host&lt;/code&gt;, so
&lt;code dir=&quot;auto&quot;&gt;request.url&lt;/code&gt; is the public URL
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1573&quot;&gt;#1573&lt;/a&gt;); a
request during a broken build gets a 502 with the build error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two beta.77 crashes are fixed too: &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; under Bun could not
import any stack because the dev probe intercepted the root’s own
&lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1617&quot;&gt;#1617&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/austinm911&quot;&gt;Austin&lt;/a&gt;!), and the interactive CLI died
with &lt;code dir=&quot;auto&quot;&gt;ReactSharedInternals.H.useMemo&lt;/code&gt; when a consumer’s install hoisted
a different React — Sigil now bundles its own
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1636&quot;&gt;#1636&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rds-s3-and-security-group-fixes&quot;&gt;RDS, S3, and security group fixes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A run of provider fixes from
&lt;a href=&quot;https://github.com/bjornpagen&quot;&gt;Bjorn Pagen&lt;/a&gt; and
&lt;a href=&quot;https://github.com/henningpokriefke&quot;&gt;Henning Pokriefke&lt;/a&gt; — thanks
both! — closes gaps where RDS, S3, and EC2 security groups trusted
state instead of the cloud: drift went unrepaired on unchanged
deploys, and removing a prop left the old value in place instead of
restoring the documented default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security groups&lt;/strong&gt; apply rule deltas instead of revoke-and-recreate
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1592&quot;&gt;#1592&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1664&quot;&gt;#1664&lt;/a&gt;), and an
inline-rule update no longer deletes &lt;code dir=&quot;auto&quot;&gt;SecurityGroupRule&lt;/code&gt; resources
attached to the same group
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1624&quot;&gt;#1624&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;egress&lt;/code&gt; has three distinct states
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1623&quot;&gt;#1623&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Omitted: AWS&apos;s default — allow all outbound IPv4.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SecurityGroup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;DefaultEgress&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { vpcId })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Explicitly empty: no outbound traffic.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SecurityGroup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NoEgress&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { vpcId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; egress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [] })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Non-empty: only what is listed.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SecurityGroup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;HttpsEgress&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;vpcId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;egress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ ipProtocol&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;tcp&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fromPort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; toPort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; cidrIpv4&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;0.0.0.0/0&quot;&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;RDS&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;DBInstance&lt;/code&gt; reconciles storage as one configuration —
allocation, type, IOPS, throughput, and the autoscaling limit sent
together when AWS requires it
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1593&quot;&gt;#1593&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1594&quot;&gt;#1594&lt;/a&gt;) — compares
the observed endpoint port
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1595&quot;&gt;#1595&lt;/a&gt;), and
restores the engine-default parameter group and the VPC default
security group when their associations are removed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1596&quot;&gt;#1596&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;DBParameterGroup&lt;/code&gt; converges to declared overrides and reads back
settled values
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1589&quot;&gt;#1589&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1590&quot;&gt;#1590&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RDS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DBInstance&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;postgres&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dbInstanceClass&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;db.t3.micro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;masterUsername&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;manageMasterUserPassword&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allocatedStorage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;// a minimum — RDS cannot shrink storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxAllocatedStorage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;// remove it to disable autoscaling&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;S3&lt;/strong&gt; buckets and &lt;code dir=&quot;auto&quot;&gt;AWS.state()&lt;/code&gt; gain
&lt;code dir=&quot;auto&quot;&gt;encryption.blockedEncryptionTypes: [&quot;SSE-C&quot;]&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1588&quot;&gt;#1588&lt;/a&gt;), compare
decoded KMS key values so matching keys skip &lt;code dir=&quot;auto&quot;&gt;PutBucketEncryption&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1587&quot;&gt;#1587&lt;/a&gt;), propagate
configuration read failures instead of reconciling over them
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1586&quot;&gt;#1586&lt;/a&gt;), and check
ownership with &lt;code dir=&quot;auto&quot;&gt;GetBucketLocation&lt;/code&gt; so configuration-only operators no
longer need &lt;code dir=&quot;auto&quot;&gt;s3:ListBucket&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1585&quot;&gt;#1585&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/data/rds&quot;&gt;RDS&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/data/s3&quot;&gt;S3&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preview packages at &lt;code dir=&quot;auto&quot;&gt;pkg.alchemy.run&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1516&quot;&gt;#1516&lt;/a&gt;) — every
PR, branch, and commit publishes installable packages from a
Cloudflare Worker registry that verifies each publication against
the GitHub Actions run that built it, so fork PRs publish with no
secrets. Dependencies are content-addressed, so shared packages
deduplicate across PRs.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pkg.alchemy.run/alchemy/pr:1516&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pkg.alchemy.run/alchemy/branch:main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Typed named entrypoint bindings&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1415&quot;&gt;#1415&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.WorkerEntrypoint&amp;#x3C;Api&gt;(target, &quot;Api&quot;)&lt;/code&gt; types &lt;code dir=&quot;auto&quot;&gt;env.API&lt;/code&gt;
as &lt;code dir=&quot;auto&quot;&gt;Service&amp;#x3C;Api&gt;&lt;/code&gt;, so &lt;code dir=&quot;auto&quot;&gt;env.API.greet(&quot;alice&quot;)&lt;/code&gt; typechecks. Thanks
&lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Railway sandboxes: domains, sizing, forks, checkpoints&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1661&quot;&gt;#1661&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;publicDomains&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;resources: { cpu, memoryGB }&lt;/code&gt;, and
&lt;code dir=&quot;auto&quot;&gt;Railway.SandboxCheckpoint&lt;/code&gt; to snapshot a prepared box and restore
it as a &lt;code dir=&quot;auto&quot;&gt;template&lt;/code&gt;. Railway reconcilers now select only the GraphQL
fields they need (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1604&quot;&gt;#1604&lt;/a&gt;),
and &lt;code dir=&quot;auto&quot;&gt;MountVolume&lt;/code&gt; actually attaches the disk
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1584&quot;&gt;#1584&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prisma Compute serves static apps&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1208&quot;&gt;#1208&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;build: &quot;auto&quot;&lt;/code&gt; recognizes Vite SPA output and adds the Bun
entrypoint Prisma requires; &lt;code dir=&quot;auto&quot;&gt;build: { type: &quot;static&quot;, spa: true }&lt;/code&gt;
serves a prebuilt directory. Thanks
&lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;! The Prisma
provider also moves onto the distilled SDK
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1290&quot;&gt;#1290&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1669&quot;&gt;#1669&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/wmadden&quot;&gt;Will Madden&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare Containers&lt;/strong&gt; — a batch from
&lt;a href=&quot;https://github.com/danieljvdm&quot;&gt;Dan van der Merwe&lt;/a&gt;, thanks!
&lt;code dir=&quot;auto&quot;&gt;memoryMib&lt;/code&gt; is forwarded
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1521&quot;&gt;#1521&lt;/a&gt;),
Dockerfile builds export straight to the registry with
&lt;code dir=&quot;auto&quot;&gt;buildx build --push&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1524&quot;&gt;#1524&lt;/a&gt;),
identical images publish once per deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1525&quot;&gt;#1525&lt;/a&gt;), a
cached identity that no longer matches Cloudflare plans a visible
replacement instead of erroring
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1523&quot;&gt;#1523&lt;/a&gt;),
interrupted creates recover by generated name
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1526&quot;&gt;#1526&lt;/a&gt;), and an
unresolved Worker namespace no longer detaches the container’s DO
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1150&quot;&gt;#1150&lt;/a&gt;). The
dev egress interceptor pulls host-native, fixing containers on
Apple Silicon
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1459&quot;&gt;#1459&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/asterikx&quot;&gt;Erik Müller&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;R2 &lt;code dir=&quot;auto&quot;&gt;put&lt;/code&gt; forwards options on the stream path&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1602&quot;&gt;#1602&lt;/a&gt;) — a
declared &lt;code dir=&quot;auto&quot;&gt;sha256&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;md5&lt;/code&gt; on an Effect &lt;code dir=&quot;auto&quot;&gt;Stream&lt;/code&gt; body is now verified
by R2 instead of silently dropped.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crons fire in &lt;code dir=&quot;auto&quot;&gt;Website.Vite&lt;/code&gt; dev workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1641&quot;&gt;#1641&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/zawaki&quot;&gt;zawaki&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Cloudflare/Bridge&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1643&quot;&gt;#1643&lt;/a&gt;) — the
Worker bridge generated wrappers import is a runtime-only entry, so
deploy tooling stays out of the bundle. Thanks
&lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EC2 instances with a fixed private IP replace delete-first&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1667&quot;&gt;#1667&lt;/a&gt;) — the
successor can’t take the address while the predecessor holds it.
Thanks &lt;a href=&quot;https://github.com/Dawsson&quot;&gt;dawson&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AWS Organizations rewrite missing ownership tags&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1637&quot;&gt;#1637&lt;/a&gt;) instead
of reporting them restored. Thanks
&lt;a href=&quot;https://github.com/henningpokriefke&quot;&gt;Henning Pokriefke&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Log group ARNs from state are normalized before tagging&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1575&quot;&gt;#1575&lt;/a&gt;) — a
&lt;code dir=&quot;auto&quot;&gt;:*&lt;/code&gt; suffix persisted by an old adoption no longer fails every
converge with &lt;code dir=&quot;auto&quot;&gt;Invalid resourceArn&lt;/code&gt;. Thanks
&lt;a href=&quot;https://github.com/evanspaeder&quot;&gt;Evan Spaeder&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ECR images skip updates when only the context directory moves&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1591&quot;&gt;#1591&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Destroy converges after drifted state&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;SNS.Subscription&lt;/code&gt;
and &lt;code dir=&quot;auto&quot;&gt;DynamoDB.Table&lt;/code&gt; tolerate an already-deleted parent
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1576&quot;&gt;#1576&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;ECS.Service&lt;/code&gt; deletes past a draining service
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1580&quot;&gt;#1580&lt;/a&gt;).
Hetzner servers and their deploy keys recover after an interrupted
create (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1662&quot;&gt;#1662&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTTP state-store errors carry no payloads&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1522&quot;&gt;#1522&lt;/a&gt;) — a
failed write reports a failure kind and status, never the request
or response body. Thanks
&lt;a href=&quot;https://github.com/danieljvdm&quot;&gt;Dan van der Merwe&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CLI fixes&lt;/strong&gt; — the published &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; resolves its sidecar
through package exports
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1678&quot;&gt;#1678&lt;/a&gt;), colors
follow the terminal’s detected profile instead of forcing truecolor
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1679&quot;&gt;#1679&lt;/a&gt;), and
the exec bundle keeps its &lt;code dir=&quot;auto&quot;&gt;.js&lt;/code&gt; extension
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1625&quot;&gt;#1625&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smaller dependency closure&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;jszip&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;fflate&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1608&quot;&gt;#1608&lt;/a&gt;),
&lt;code dir=&quot;auto&quot;&gt;fast-glob&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;tinyglobby&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1609&quot;&gt;#1609&lt;/a&gt;), and
Foldkit &lt;code dir=&quot;auto&quot;&gt;^0.160.0&lt;/code&gt; for effect rc.115
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1618&quot;&gt;#1618&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Core docs read as one narrative&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1652&quot;&gt;#1652&lt;/a&gt;) — each
concept has one owning page; &lt;code dir=&quot;auto&quot;&gt;/infrastructure-as-effects&lt;/code&gt; redirects
to &lt;a href=&quot;https://alchemy.run/what-is-alchemy&quot;&gt;What is Alchemy&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/git&quot;&gt;Git&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/git/getting-started&quot;&gt;Getting Started&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/git/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/stripe&quot;&gt;Stripe&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/stripe/guides/subscriptions&quot;&gt;Sell a subscription&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/stripe/guides/connect&quot;&gt;Connect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/previews&quot;&gt;Worker Previews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/github&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/data/rds&quot;&gt;RDS&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/data/s3&quot;&gt;S3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta78&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.77...v2.0.0-beta.78&quot;&gt;Compare v2.0.0-beta.77 → v2.0.0-beta.78&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.77 - Profiles, CLI &amp; Workers Tracing</title><link>https://alchemy.run/blog/2026-09-08-beta-77/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-09-08-beta-77/</guid><description>v2.0.0-beta.77 redesigns the CLI — alchemy login becomes alchemy profile, profiles are stored as a folder per profile with a file per provider, and every TUI action has a non-interactive twin for agents and CI — and adds Cloudflare.Telemetry() for tracing Workers in Workers Observability. Also dependency-aware dev reloads, cron schedules on Workflows, provisioned ElastiCache, and private/pre-deploy/local-context Railway services.</description><pubDate>Tue, 08 Sep 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.77 redesigns the CLI. &lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; becomes
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile&lt;/code&gt;&lt;/strong&gt;, a dashboard for every connected account
whose every action is also a non-interactive subcommand; profiles
are stored as &lt;strong&gt;a folder per profile with a file per provider&lt;/strong&gt;
instead of a central &lt;code dir=&quot;auto&quot;&gt;profiles.json&lt;/code&gt;; and &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; gets a
plan/output widget you can flip with &lt;code dir=&quot;auto&quot;&gt;←/→&lt;/code&gt;. Outside the CLI,
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Telemetry()&lt;/code&gt;&lt;/strong&gt; sends Effect spans to Workers
Observability with no OTLP setup, Workflows take cron schedules,
and AWS gains provisioned ElastiCache.&lt;/p&gt;
&lt;p&gt;Here is the new CLI on a fresh machine, start to finish:&lt;/p&gt;
&lt;p&gt;&lt;video controls muted playsinline preload=&quot;metadata&quot; poster=&quot;/blog/beta-77/alchemy-cli-poster.png&quot; src=&quot;/blog/beta-77/alchemy-cli.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;alchemy drift&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;alchemy destroy&lt;/code&gt;. The same walkthrough, frame by frame, is below.&lt;/em&gt;&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; defaults to &lt;code dir=&quot;auto&quot;&gt;live_$USER&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1421&quot;&gt;#1421&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;plan&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;logs&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;drift&lt;/code&gt; follow; &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;
keeps &lt;code dir=&quot;auto&quot;&gt;dev_$USER&lt;/code&gt;. Pass &lt;code dir=&quot;auto&quot;&gt;--stage dev_sam&lt;/code&gt; to keep deploying to
an old target. The stage env var is now &lt;code dir=&quot;auto&quot;&gt;ALCHEMY_STAGE&lt;/code&gt;, not
&lt;code dir=&quot;auto&quot;&gt;STAGE&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1433&quot;&gt;#1433&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commands moved&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1234&quot;&gt;#1234&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1235&quot;&gt;#1235&lt;/a&gt;). The
old names print a migration hint instead of running:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login --configure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile edit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile clear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile delete&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy tail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy logs --follow&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy sync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy drift --repair&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy destroy --dry-run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy plan --destroy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy aws&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;cloudflare&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy provider aws&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;cloudflare&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The AWS &lt;code dir=&quot;auto&quot;&gt;local&lt;/code&gt; auth method is removed&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1480&quot;&gt;#1480&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; wires the local emulator itself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;distilled operations are &lt;code dir=&quot;auto&quot;&gt;verbNoun&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1517&quot;&gt;#1517&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;railway.serviceCreate&lt;/code&gt; is now &lt;code dir=&quot;auto&quot;&gt;railway.createService&lt;/code&gt;. Only
affects code that calls a distilled client directly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;1-connect-an-account&quot;&gt;1. Connect an account&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; is now &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy profile&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1234&quot;&gt;#1234&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1235&quot;&gt;#1235&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1547&quot;&gt;#1547&lt;/a&gt;). On a
fresh machine it opens on an empty &lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt; profile:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/profile-empty.png&quot; alt=&quot;alchemy profile on a fresh machine: one empty default profile&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;e&lt;/code&gt; lists every provider. Space queues a change on the focused
row — here Cloudflare goes to &lt;code dir=&quot;auto&quot;&gt;add&lt;/code&gt; — and Enter runs the queue:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/profile-add.png&quot; alt=&quot;the edit menu with Cloudflare queued to add&quot;&gt;&lt;/p&gt;
&lt;p&gt;Each provider asks only what it needs. Cloudflare offers OAuth or
a token:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/profile-method.png&quot; alt=&quot;choosing OAuth as the Cloudflare authentication method&quot;&gt;&lt;/p&gt;
&lt;p&gt;OAuth opens the browser; you approve the grant there:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/oauth-consent.png&quot; alt=&quot;Cloudflare’s consent page for Alchemy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Back on the dashboard the provider is a row with its live details:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/profile-connected.png&quot; alt=&quot;the dashboard after connecting: Cloudflare via oauth, token expiry, account id&quot;&gt;&lt;/p&gt;
&lt;p&gt;Profiles are tabs, &lt;code dir=&quot;auto&quot;&gt;←/→&lt;/code&gt; switches between them, and every profile
holds one connection per provider — a &lt;code dir=&quot;auto&quot;&gt;work&lt;/code&gt; profile with a
Cloudflare token next to a &lt;code dir=&quot;auto&quot;&gt;default&lt;/code&gt; with OAuth + AWS SSO:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/profile-dashboard.png&quot; alt=&quot;two profiles, each with several providers&quot;&gt;&lt;/p&gt;
&lt;p&gt;Every key on the dashboard is also a subcommand, and the
subcommands never prompt:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;work&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;work&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# runs the OAuth flow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;refresh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--provider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rename&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;work&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;staging&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;staging&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For agents and CI, token-shaped methods are configured entirely
from flags. &lt;code dir=&quot;auto&quot;&gt;--set&lt;/code&gt; takes a literal, an environment variable, or
stdin, so secrets never touch shell history:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--method&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stored&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiToken=env:CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;accountId=0123456789abcdef0123456789abcdef&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;op&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;op://vault/neon/key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;neon&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--method&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stored&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apiKey=-&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Under the hood, the central &lt;code dir=&quot;auto&quot;&gt;profiles.json&lt;/code&gt; and the separate
&lt;code dir=&quot;auto&quot;&gt;credentials/&lt;/code&gt; tree are gone. A profile is a directory and each
provider is one file holding its method, config, and credentials
together. Existing installs migrate on first run, with the old
layout backed up to &lt;code dir=&quot;auto&quot;&gt;~/.alchemy/.profiles-v0-&amp;#x3C;timestamp&gt;/&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1429&quot;&gt;#1429&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;~/.alchemy/profiles/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├─ default/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ├─ cloudflare.json   # method: oauth, accountId, tokens, scopes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  └─ aws.json          # method: sso, ssoProfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└─ work/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ cloudflare.json   # method: stored, apiToken, accountId&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Only &lt;code dir=&quot;auto&quot;&gt;profile&lt;/code&gt; commands log in. &lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;plan&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;dev&lt;/code&gt; never
open a wizard — a missing credential fails with the exact
&lt;code dir=&quot;auto&quot;&gt;alchemy profile edit --add …&lt;/code&gt; to run. Explicit provider
environment variables (&lt;code dir=&quot;auto&quot;&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AWS_ACCESS_KEY_ID&lt;/code&gt;,
…) take precedence over the profile, per provider, and the CLI
logs which ones it used
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1520&quot;&gt;#1520&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cli/profile&quot;&gt;profile&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/profiles&quot;&gt;Profiles&lt;/a&gt;
· &lt;a href=&quot;https://alchemy.run/environments/ci&quot;&gt;CI&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;2-alchemy-dev&quot;&gt;2. &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The stack in the video is a Worker bound to a KV namespace and an
R2 bucket:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;visits&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Visits&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uploads&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Uploads&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* … */&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteNamespaceBinding&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketBinding&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; emulates all three locally. Logs scroll above; the
widget at the bottom shows the stack’s output:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/dev-output.png&quot; alt=&quot;alchemy dev running, output widget showing the local url and bucket&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;←/→&lt;/code&gt; flips the widget to the last applied plan — the same
component &lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;drift&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt; render
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1458&quot;&gt;#1458&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1492&quot;&gt;#1492&lt;/a&gt;). &lt;code dir=&quot;auto&quot;&gt;↑/↓&lt;/code&gt;
scrolls it, &lt;code dir=&quot;auto&quot;&gt;p&lt;/code&gt; hides it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/dev-plan.png&quot; alt=&quot;the same widget flipped to the plan: 3 created&quot;&gt;&lt;/p&gt;
&lt;p&gt;Save a file and only the affected resource restarts. Reloads follow
the import graph from your entrypoint — sibling &lt;code dir=&quot;auto&quot;&gt;infra/&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;src/&lt;/code&gt;
trees included — and only fire when a file’s contents actually
change (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1461&quot;&gt;#1461&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1477&quot;&gt;#1477&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/dev-reload.png&quot; alt=&quot;after editing the worker: 1 updated, 2 no change&quot;&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;3-alchemy-deploy&quot;&gt;3. &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt; shows the plan first. Bindings appear under the resource
they attach to, and the prompt defaults to go:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/deploy-confirm.png&quot; alt=&quot;the deploy plan: 3 to create, 2 binding changes, Deploy highlighted&quot;&gt;&lt;/p&gt;
&lt;p&gt;Provider logs stream while it runs; the plan ticks over as each
resource lands and the stack’s outputs print at the end:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/deploy-done.png&quot; alt=&quot;stack deployed: url and bucket outputs&quot;&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://demo-api-live-samgoodwin-sthgco4pjlba35wc.testing-2b2.workers.dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;Hello from Alchemy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;visits&quot;&lt;/span&gt;&lt;span&gt;:1}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;4-alchemy-drift&quot;&gt;4. &lt;code dir=&quot;auto&quot;&gt;alchemy drift&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Someone renames the KV namespace in the Cloudflare dashboard.
&lt;code dir=&quot;auto&quot;&gt;alchemy drift&lt;/code&gt; re-reads the cloud and diffs it against what was
deployed — the changed attribute renders inline, and &lt;code dir=&quot;auto&quot;&gt;Repair&lt;/code&gt;
puts it back:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/drift-detected.png&quot; alt=&quot;drift detected: title changed on the KV namespace, Repair highlighted&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/drift-repaired.png&quot; alt=&quot;the repair applied: 1 updated&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy drift --repair&lt;/code&gt; does the same without the prompt.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;5-alchemy-destroy&quot;&gt;5. &lt;code dir=&quot;auto&quot;&gt;alchemy destroy&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Destructive prompts default to &lt;code dir=&quot;auto&quot;&gt;Cancel&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/destroy-confirm.png&quot; alt=&quot;the destroy plan: 3 to delete, Cancel highlighted&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/destroy-done.png&quot; alt=&quot;stack destroyed&quot;&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;without-a-tty&quot;&gt;Without a TTY&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In CI, a pipe, or a coding agent, the same commands print plain
append-only lines instead of the TUI — or force it with
&lt;code dir=&quot;auto&quot;&gt;ALCHEMY_PLAIN=1&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;--no-input&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1423&quot;&gt;#1423&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1426&quot;&gt;#1426&lt;/a&gt;). Same
deploy as above, plain:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/beta-77/deploy-plain.png&quot; alt=&quot;ALCHEMY_PLAIN=1 alchemy deploy –yes: timestamped log lines for the plan, each create, Done: 3 succeeded, and the outputs&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exit codes are &lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt; done / &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt; failed or declined / &lt;code dir=&quot;auto&quot;&gt;130&lt;/code&gt; cancelled,
and every run writes a debug log under &lt;code dir=&quot;auto&quot;&gt;~/.alchemy/logs&lt;/code&gt; — the first
thing to attach to a bug report.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cli&quot;&gt;CLI&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/dev&quot;&gt;dev&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/deploy&quot;&gt;deploy&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/cli/drift&quot;&gt;drift&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflaretelemetry&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Telemetry()&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Effect spans from a Worker now land in
&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;Workers Observability&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1444&quot;&gt;#1444&lt;/a&gt;).
Provide the Layer on the Worker and your &lt;code dir=&quot;auto&quot;&gt;Effect.withSpan&lt;/code&gt; frames
show up in the Cloudflare dashboard, nested under the platform’s
own spans:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kv&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;user:1&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;withSpan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;load.user&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;respond&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;withSpan&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;handle&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Telemetry&lt;/span&gt;&lt;span&gt;()))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;http.server GET&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└─ handle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├─ load.user&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│  └─ kv_get&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ respond&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare owns sampling and export, so there is no OTLP endpoint
and nothing to flush. It composes with &lt;code dir=&quot;auto&quot;&gt;Axiom.Telemetry&lt;/code&gt; for the
same waterfall in both. The Worker’s compatibility date must be
&lt;code dir=&quot;auto&quot;&gt;2026-07-28&lt;/code&gt; or later.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/observability/workers-tracing&quot;&gt;Native Workers tracing&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workflows-cron-schedules&quot;&gt;Workflows: cron schedules&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare Workflows take wrangler-compatible &lt;code dir=&quot;auto&quot;&gt;schedules&lt;/code&gt;, so a
cron expression creates instances natively — no Cron Trigger
Worker calling &lt;code dir=&quot;auto&quot;&gt;workflow.create()&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1491&quot;&gt;#1491&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hourly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflow&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Hourly&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Hourly&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ schedules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;0 * * * *&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflows&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkflowEvent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;?.cron&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;provisioned-elasticache&quot;&gt;Provisioned ElastiCache&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.ElastiCache&lt;/code&gt; adds &lt;code dir=&quot;auto&quot;&gt;SubnetGroup&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;ReplicationGroup&lt;/code&gt; (Valkey
and Redis OSS) and &lt;code dir=&quot;auto&quot;&gt;CacheCluster&lt;/code&gt; (Memcached) alongside the
serverless cache, with &lt;code dir=&quot;auto&quot;&gt;Connect*&lt;/code&gt; bindings that publish the
endpoint to a Lambda and attach it to the cache’s VPC
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1422&quot;&gt;#1422&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/henningpokriefke&quot;&gt;Henning Pokriefke&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ElastiCache&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReplicationGroup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;engine&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;valkey&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nodeType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cache.t4g.micro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;subnetGroupName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subnetGroup&lt;/span&gt;&lt;span&gt;.subnetGroupName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;securityGroupIds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;sg&lt;/span&gt;&lt;span&gt;.groupId]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;replicasPerNodeGroup&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;automaticFailoverEnabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// inside the Lambda: endpoint env + VPC attachment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ElastiCache&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectReplicationGroup&lt;/span&gt;&lt;span&gt;(cache&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;subnetIds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vpc&lt;/span&gt;&lt;span&gt;.privateSubnetIds&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;securityGroupIds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;sg&lt;/span&gt;&lt;span&gt;.groupId]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;railway-private-services-pre-deploy-local-contexts&quot;&gt;Railway: private services, pre-deploy, local contexts&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Three additions to &lt;code dir=&quot;auto&quot;&gt;Railway.Service&lt;/code&gt;, all from
&lt;a href=&quot;https://github.com/dallenpyrah&quot;&gt;Dallen Pyrah&lt;/a&gt; — thanks!
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1439&quot;&gt;#1439&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1438&quot;&gt;#1438&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1440&quot;&gt;#1440&lt;/a&gt;)&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// build from a local directory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preDeploy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bun migrate&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// runs between build and start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;publicDomain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;// {name}.railway.internal only&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fly health checks&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1463&quot;&gt;#1463&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;services[].checks&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Fly.Machine&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt;. Thanks
&lt;a href=&quot;https://github.com/adamsvystun&quot;&gt;Adam Svystun&lt;/a&gt;! Fly Machines
requests also stop hitting &lt;code dir=&quot;auto&quot;&gt;/v1/v1/…&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1543&quot;&gt;#1543&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable Objects: &lt;code dir=&quot;auto&quot;&gt;webSocketError&lt;/code&gt; and caller context&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1497&quot;&gt;#1497&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1498&quot;&gt;#1498&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;blockConcurrencyWhile&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;storage.transaction&lt;/code&gt; run with the
calling fiber’s context. Thanks &lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt;!
&lt;code dir=&quot;auto&quot;&gt;state.abort(reason, { retryAlarm: false })&lt;/code&gt; stops an interrupted
alarm from retrying
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1374&quot;&gt;#1374&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker.ref&lt;/code&gt; typechecks&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1434&quot;&gt;#1434&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/hello-pollux&quot;&gt;pollux&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asset uploads run three buckets at a time&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1445&quot;&gt;#1445&lt;/a&gt;),
matching wrangler; workerd bumped to &lt;code dir=&quot;auto&quot;&gt;20260901.1&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1442&quot;&gt;#1442&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow steps with &lt;code dir=&quot;auto&quot;&gt;retries&lt;/code&gt; but no &lt;code dir=&quot;auto&quot;&gt;timeout&lt;/code&gt; no longer
crash&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1416&quot;&gt;#1416&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/LordCoughmann&quot;&gt;Lord Coughmann&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ctrl+C twice force-quits a slow shutdown&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1427&quot;&gt;#1427&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;_headers&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;_redirects&lt;/code&gt; no longer crash local dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1418&quot;&gt;#1418&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/deracs&quot;&gt;Michael&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker Loader &lt;code dir=&quot;auto&quot;&gt;get()&lt;/code&gt; returns a usable stub&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1488&quot;&gt;#1488&lt;/a&gt;) and
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;RpcWorker&lt;/code&gt; keeps its logical ID&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1487&quot;&gt;#1487&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;nuke&lt;/code&gt; shows progress again&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1532&quot;&gt;#1532&lt;/a&gt;), and
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;provider cloudflare bootstrap&lt;/code&gt; honors &lt;code dir=&quot;auto&quot;&gt;--profile&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1538&quot;&gt;#1538&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR preview packages live as long as the PR&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1511&quot;&gt;#1511&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs rewritten as a narrative&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1470&quot;&gt;#1470&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1472&quot;&gt;#1472&lt;/a&gt;) —
&lt;a href=&quot;https://alchemy.run/getting-started&quot;&gt;Getting started&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/what-is-alchemy&quot;&gt;What is Alchemy&lt;/a&gt;, and the Workers hub read
top to bottom.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cli&quot;&gt;CLI&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/profile&quot;&gt;profile&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/dev&quot;&gt;dev&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/drift&quot;&gt;drift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/profiles&quot;&gt;Profiles&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/ci&quot;&gt;CI&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/stages&quot;&gt;Stages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/observability/workers-tracing&quot;&gt;Native Workers tracing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta77&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.76...v2.0.0-beta.77&quot;&gt;Compare v2.0.0-beta.76 → v2.0.0-beta.77&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.75 - Railway, Fly, Hetzner &amp; Websites</title><link>https://alchemy.run/blog/2026-08-25-beta-75/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-08-25-beta-75/</guid><description>v2.0.0-beta.75 ships Railway alongside Fly.io and Hetzner, deploys the same website frameworks to Cloudflare, AWS, Hetzner, Railway, and Fly, brings alchemy dev to AWS — Lambda, S3, DynamoDB, SQS, ECS, EC2, and websites on your machine with no credentials — and routes inbound email to Workers.</description><pubDate>Tue, 25 Aug 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.75 ships &lt;strong&gt;Railway, Fly.io, and Hetzner&lt;/strong&gt; — each with an
Effect-native &lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt; platform. The
same website call now deploys to all three plus &lt;strong&gt;Cloudflare and
AWS&lt;/strong&gt;: Vite, Astro, Next.js, Nuxt, SvelteKit, Waku, Octane,
Foldkit, and StaticSite, with one props vocabulary.
&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs your AWS Lambda, S3, DynamoDB, SQS, ECS,
EC2, and website stack &lt;strong&gt;on your machine&lt;/strong&gt; — no account, no
credentials, hot reload. SQL migrations have one format,
Workers can sit behind Access and receive inbound email, and
removal policies persist.&lt;/p&gt;
&lt;p&gt;This post covers beta.72 through beta.75.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-rc.112&lt;/code&gt; is the new minimum peer&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1245&quot;&gt;#1245&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1318&quot;&gt;#1318&lt;/a&gt;) —
effect has moved from beta to release candidates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/cloudflare-frameworks&lt;/code&gt; is now
&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/frontend-frameworks&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1140&quot;&gt;#1140&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1154&quot;&gt;#1154&lt;/a&gt;) —
the framework integrations serve every cloud now. Update your
devDependency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website props are one vocabulary&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1353&quot;&gt;#1353&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1351&quot;&gt;#1351&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1158&quot;&gt;#1158&lt;/a&gt;) —
AWS’s &lt;code dir=&quot;auto&quot;&gt;server:&lt;/code&gt; bag is gone, Cloudflare’s mirrored framework
fields move into &lt;code dir=&quot;auto&quot;&gt;astro:&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;waku:&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;assets.notFoundHandling&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;StaticSite.environment&lt;/code&gt; is
&lt;code dir=&quot;auto&quot;&gt;build.env&lt;/code&gt;. Lambda’s &lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;functionUrl&lt;/code&gt;;
&lt;code dir=&quot;auto&quot;&gt;Website.Server&lt;/code&gt;’s &lt;code dir=&quot;auto&quot;&gt;port&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;dev: { port }&lt;/code&gt;. See
&lt;a href=&quot;#websites-on-five-clouds&quot;&gt;below&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL migrations have one prop and one format&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1226&quot;&gt;#1226&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;migrationsDir&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;migrationsTable&lt;/code&gt; are replaced by a single
&lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt; prop, and history lives in &lt;code dir=&quot;auto&quot;&gt;__alchemy_migrations&lt;/code&gt;.
Databases previously migrated with drizzle-kit, Prisma, or
wrangler are converted automatically on the next deploy — see
&lt;a href=&quot;#one-migration-format-for-sql-databases&quot;&gt;below&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Worker.workerId&lt;/code&gt; is now the immutable Worker ID&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1228&quot;&gt;#1228&lt;/a&gt;) —
the hex script tag Access destinations key on, not a duplicate
of &lt;code dir=&quot;auto&quot;&gt;workerName&lt;/code&gt;. Old state heals itself on the next deploy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destroying a non-empty R2 bucket now fails&lt;/strong&gt; instead of
silently deleting every object
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1253&quot;&gt;#1253&lt;/a&gt;) —
opt back in with &lt;code dir=&quot;auto&quot;&gt;forceDestroy: true&lt;/code&gt;. And a removed
&lt;code dir=&quot;auto&quot;&gt;RemovalPolicy.retain()&lt;/code&gt; now actually takes effect — see
&lt;a href=&quot;#removal-policies-persist&quot;&gt;below&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB secondary indexes take typed keys&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1216&quot;&gt;#1216&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;partitionKey&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;sortKey&lt;/code&gt; segments instead of the raw wire
&lt;code dir=&quot;auto&quot;&gt;KeySchema&lt;/code&gt; list. Existing state upgrades without a
replacement.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-depends-on-effectrc&quot;&gt;alchemy depends on effect@rc&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;effect 4.0 has moved from beta to release candidates, and alchemy
now depends on effect’s &lt;code dir=&quot;auto&quot;&gt;rc&lt;/code&gt; dist-tag
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1245&quot;&gt;#1245&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1318&quot;&gt;#1318&lt;/a&gt;). The
minimum peer is &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-rc.112&lt;/code&gt;; install effect and the platform
packages from the &lt;code dir=&quot;auto&quot;&gt;rc&lt;/code&gt; tag:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;effect@rc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-bun@rc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-node@rc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;websites-on-five-clouds&quot;&gt;Websites on five clouds&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Website family now deploys to &lt;strong&gt;Cloudflare, AWS, Hetzner,
Railway, and Fly&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1140&quot;&gt;#1140&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1353&quot;&gt;#1353&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1351&quot;&gt;#1351&lt;/a&gt;).
Your &lt;code dir=&quot;auto&quot;&gt;astro.config.*&lt;/code&gt; loads natively. Stage-varying values go in
the &lt;code dir=&quot;auto&quot;&gt;astro:&lt;/code&gt; bag. Change the namespace to change the cloud:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rootDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./apps/blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_BASE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { site&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`https://${&lt;/span&gt;&lt;span&gt;stage&lt;/span&gt;&lt;span&gt;}.example.com`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;server&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;blog.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const site &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rootDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./apps/blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_BASE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { site&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`https://${&lt;/span&gt;&lt;span&gt;stage&lt;/span&gt;&lt;span&gt;}.example.com`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;server&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;blog.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Website.Astro&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Railway.Website.Astro&lt;/code&gt; take the same
props. Hetzner adds the DNS &lt;code dir=&quot;auto&quot;&gt;zone&lt;/code&gt; when you set &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rootDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./apps/blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_BASE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { site&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`https://${&lt;/span&gt;&lt;span&gt;stage&lt;/span&gt;&lt;span&gt;}.example.com`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;server&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;blog.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;zone&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; is the framework’s own server on every cloud —
native HMR, no cloud resources. A Vite SPA is the same shape,
assets-only on AWS (no Lambda):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Vite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Web&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;app.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Next.js is the same call. Cloudflare and AWS run OpenNext;
Fly, Hetzner, and Railway run &lt;code dir=&quot;auto&quot;&gt;next build&lt;/code&gt; and a Node server:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Nextjs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rootDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./apps/web&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;DATABASE_URL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.connectionUri }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;app.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;AWS’s old &lt;code dir=&quot;auto&quot;&gt;server:&lt;/code&gt; bag is now flat props:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Blog&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;memorySize&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_URL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;memorySize&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_URL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { site&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`https://${&lt;/span&gt;&lt;span&gt;stage&lt;/span&gt;&lt;span&gt;}.example.com`&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;blog.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Vite&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Foldkit&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Astro&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Nextjs&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Nuxt&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;SvelteKit&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Waku&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Octane&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; on all five.
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.Vocs&lt;/code&gt; also lands on Fly, Hetzner, and
Railway. React Router, SolidStart, and TanStack Start stay on
Cloudflare (&lt;code dir=&quot;auto&quot;&gt;Website.Vite&lt;/code&gt;) and AWS (dedicated composites).
Each cloud has a matching example
(&lt;code dir=&quot;auto&quot;&gt;examples/{cloudflare,aws,fly,hetzner,railway}-website-{framework}&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Docs:
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Cloudflare&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/aws/frontend/websites&quot;&gt;AWS&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/fly&quot;&gt;Fly&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/hetzner&quot;&gt;Hetzner&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/railway&quot;&gt;Railway&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;railway&quot;&gt;Railway&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Railway provider&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1295&quot;&gt;#1295&lt;/a&gt;):
Project, Service, Function, Postgres, MySQL, Mongo, Redis,
Bucket, Volume, Variable, CustomDomain, TcpProxy, and
PrivateNetwork. Auth is &lt;code dir=&quot;auto&quot;&gt;RAILWAY_API_TOKEN&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A Project is the parent. &lt;code dir=&quot;auto&quot;&gt;Railway.Service&lt;/code&gt; is the
Function/Worker analog: an Effect program in a container.
Alchemy bundles &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt;, builds a Docker image, and pushes it to
a registry Railway can pull (GHCR or Docker Hub — Railway has
no private registry of its own):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Project&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ghcr.io/acme&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { install&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;pg&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectPostgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Db&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt;.connectionString)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectPostgresHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;api.url&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;https://{name}.up.railway.app&lt;/code&gt;. Redis and S3-style
Buckets bind the same way:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Redis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Data&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; registry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ghcr.io/acme&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteRedis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cache&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;last-write&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteRedisHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObjectHttp&lt;/span&gt;&lt;span&gt;]))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Pass &lt;code dir=&quot;auto&quot;&gt;image&lt;/code&gt; for a public tag (&lt;code dir=&quot;auto&quot;&gt;hashicorp/http-echo&lt;/code&gt;) or &lt;code dir=&quot;auto&quot;&gt;repo&lt;/code&gt;
for GitHub; &lt;code dir=&quot;auto&quot;&gt;healthcheck&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;cronSchedule&lt;/code&gt; match Railway IaC.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Railway.Function&lt;/code&gt; is the canvas runtime: a single TypeScript
file on Bun. No Docker. No registry. Cap is 96KB. Distinct from
&lt;code dir=&quot;auto&quot;&gt;Service({ main, registry })&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Railway&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Ping&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Ping&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)) }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/railway&quot;&gt;Railway&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/railway/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;hetzner&quot;&gt;Hetzner&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Hetzner Cloud provider&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1258&quot;&gt;#1258&lt;/a&gt;):
Server, SshKey, Volume, VolumeAttachment, Network, Firewall,
PlacementGroup, PrimaryIp, FloatingIp, FloatingIpAssignment,
Certificate, LoadBalancer, Image, and DNS Zone + RecordSet. Auth
is a single &lt;code dir=&quot;auto&quot;&gt;HCLOUD_TOKEN&lt;/code&gt; (or &lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt;).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SshKey&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;laptop&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;publicKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ssh-ed25519 AAAA… you@laptop&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Server&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;box&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serverType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cpx12&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ubuntu-24.04&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nbg1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sshKeys&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Hetzner.Service&lt;/code&gt; is the Function/Worker analog for a server you
own. Write an Effect program with a &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; handler; deploying
bundles it, ships it to the server, and runs it under systemd
with a readiness gate:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Volume&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;data&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;40&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ext4&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nbg1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MountVolume&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/var/lib/api&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FileSystem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FileSystem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;readFileString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;disk&lt;/span&gt;&lt;span&gt;.path&lt;/span&gt;&lt;span&gt;}/hello.txt`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MountVolumeLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Bindings follow the same capability model as AWS and Cloudflare:
&lt;code dir=&quot;auto&quot;&gt;MountVolume&lt;/code&gt; formats, attaches, and mounts a Volume into the
service, &lt;code dir=&quot;auto&quot;&gt;Hetzner.Ssh(Box)&lt;/code&gt; is a typed &lt;code dir=&quot;auto&quot;&gt;exec&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;scp&lt;/code&gt; client for a
Server, and the DNS zone splits into least-privilege
&lt;code dir=&quot;auto&quot;&gt;ReadDns&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;WriteDns&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;ReadWriteDns&lt;/code&gt; clients. Networking is a
private Network, Firewall rules, and a LoadBalancer with managed
TLS certificates:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Lb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;lb&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;nbg1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadBalancerType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;lb11&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;targets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;server&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; usePrivateIp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;protocol&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listenPort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;destinationPort&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;certificates&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Managed&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { redirectHttp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Hetzner gets its own docs tab
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1260&quot;&gt;#1260&lt;/a&gt;): a
setup guide, a four-part tutorial (server → service → volume →
network + load balancer), and guides for servers, services,
volumes, networking, and DNS.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/hetzner&quot;&gt;Hetzner&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/hetzner/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;flyio&quot;&gt;Fly.io&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Fly.io provider&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1261&quot;&gt;#1261&lt;/a&gt;): App,
Machine, Service, Sprite, Volume + VolumeSnapshot, IpAssignment,
Certificate, Secret, SecretKey, and managed data — Postgres,
Upstash Redis, and Tigris object storage. Auth is a single
&lt;code dir=&quot;auto&quot;&gt;FLY_API_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt; is the Function/Worker analog: an always-on Effect
program in a Fly Machine. Alchemy bundles &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt;, builds a Docker
image, pushes it, and Fly’s Anycast proxy load-balances across
&lt;code dir=&quot;auto&quot;&gt;count&lt;/code&gt; replicas:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;region&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;iad&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; schema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Drizzle.Schema, a directory, or { dir, table }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; region&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;iad&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; count&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectPostgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Db&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt;.connectionString)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectPostgresHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Upstash Redis and Tigris object storage bind the same way —
&lt;code dir=&quot;auto&quot;&gt;ReadRedis&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;WriteRedis&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;ReadWriteRedis&lt;/code&gt; on a &lt;code dir=&quot;auto&quot;&gt;Fly.Redis&lt;/code&gt;,
and S3-style &lt;code dir=&quot;auto&quot;&gt;PutObject&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;GetObject&lt;/code&gt; on a &lt;code dir=&quot;auto&quot;&gt;Fly.Bucket&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Redis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cache&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Upstash Redis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Data&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Tigris object storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ app&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Site&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteRedis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cache&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;last-write&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteRedisHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObjectHttp&lt;/span&gt;&lt;span&gt;]))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The rest of the surface follows the same capability model:
&lt;code dir=&quot;auto&quot;&gt;GetSecret&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;WriteSecret&lt;/code&gt; on app secrets,
&lt;code dir=&quot;auto&quot;&gt;Encrypt&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;Decrypt&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;Sign&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;Verify&lt;/code&gt; on a &lt;code dir=&quot;auto&quot;&gt;SecretKey&lt;/code&gt;, and
&lt;code dir=&quot;auto&quot;&gt;MountVolume&lt;/code&gt; for disks. Already have an image? &lt;code dir=&quot;auto&quot;&gt;Fly.Machine&lt;/code&gt;
runs it as one VM per resource — yield another to add capacity.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Fly.Sprite&lt;/code&gt; deploys an Effect program onto a
&lt;a href=&quot;https://fly.io/sprites&quot;&gt;Fly Sprite&lt;/a&gt; — a persistent Linux
computer built for AI-agent workloads. It wakes on demand,
hibernates when idle, and keeps its filesystem between wakes. No
parent App, no Docker image: alchemy bundles &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; and writes it
straight onto the Sprite:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Sprite&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Box&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;)) }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/fly&quot;&gt;Fly.io&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/fly/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;aws-local-dev&quot;&gt;AWS local dev&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; now runs your AWS stack on your machine
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1154&quot;&gt;#1154&lt;/a&gt;). No
account, no credentials:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Same program as production. A Function that writes to a bucket
and a queue:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; functionUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Files&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Jobs&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;files&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SendMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putObject&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello.txt&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendMessage&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;MessageBody&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;process hello.txt&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.orDie)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutObjectHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SendMessageHttp&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;hits local endpoints:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Api.functionUrl  http://b71ff5c0….lambda-url.us-east-1.localhost:4566/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Jobs.queueUrl    http://localhost:4566/000000000000/jobs-dev-x7k2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Files.bucketName files-dev-x7k2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Save the file and the Function serves the new code in
&lt;strong&gt;~100–500ms&lt;/strong&gt;. &lt;code dir=&quot;auto&quot;&gt;putObject&lt;/code&gt; lands in the local bucket; queue
consumers fire; websites run their own dev servers.&lt;/p&gt;
&lt;p&gt;Opt a resource onto the real cloud with &lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SecretsManager&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Secret&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ProdSecret&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A remote resource is live end to end: its binding clients route
to the real cloud too, not just its lifecycle
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1406&quot;&gt;#1406&lt;/a&gt;).
Switching local ↔ live plans a &lt;strong&gt;replacement&lt;/strong&gt;, so dev state
never silently becomes cloud state.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/local-development&quot;&gt;AWS local development&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;local-ecs-and-microvms&quot;&gt;Local ECS and MicroVMs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs ECS tasks and Lambda MicroVMs the same way
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1185&quot;&gt;#1185&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1335&quot;&gt;#1335&lt;/a&gt;) — same
program, two runtimes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Web&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Task&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Web&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Web&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MicrovmImage&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Box&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Box&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Save a file and both reload. EC2 instances that host an Effect
program do too.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/local-development&quot;&gt;AWS local development&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-migration-format-for-sql-databases&quot;&gt;One migration format for SQL databases&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy’s migration bookkeeping was an invented table shape
incompatible with what drizzle-kit, Prisma, and wrangler actually
maintain. There is now exactly &lt;strong&gt;one&lt;/strong&gt; format, owned by Alchemy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1226&quot;&gt;#1226&lt;/a&gt;):
&lt;code dir=&quot;auto&quot;&gt;__alchemy_migrations&lt;/code&gt;, with one prop on every SQL database
resource (D1, Neon, PlanetScale):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app-db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./migrations&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// or { dir, table }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Drizzle.Schema&lt;/code&gt; plugs into the same prop. It diffs your
TypeScript schema against the checked-in snapshot and generates
SQL migrations on drift, and passing the resource itself orders
generation before application in the same deploy:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AppSchema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/schema.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dialect&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sqlite&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app-db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; schema&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A database previously migrated with drizzle-kit, Prisma, or
wrangler is adopted on first deploy by a &lt;strong&gt;one-way conversion&lt;/strong&gt;:
the old tool’s applied history is copied into Alchemy’s table
once, validated against your local migration files, and the old
table is left frozen — never written, never dropped. Nothing
replays.&lt;/p&gt;
&lt;p&gt;History validation is now strict — a recorded migration with no
matching local file fails the deploy instead of passing silently.
If you squashed and deleted old migration files, restore them
before upgrading.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;protect-workers-with-access&quot;&gt;Protect Workers with Access&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Support for
&lt;a href=&quot;https://blog.cloudflare.com/workers-protected-by-access/&quot;&gt;Workers protected by Access&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1228&quot;&gt;#1228&lt;/a&gt;):
declare policies inline on the Worker and alchemy manages the
dedicated Access application for you —&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;policies&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ decision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;allow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ emailDomain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt; }] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;— or share one &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Access.Application&lt;/code&gt; across several
Workers (&lt;code dir=&quot;auto&quot;&gt;access: App&lt;/code&gt;), or protect &lt;strong&gt;every current and future
Worker in the account&lt;/strong&gt; with the &lt;code dir=&quot;auto&quot;&gt;AllWorkers&lt;/code&gt; destination.
Enrollment goes through the binding contract, so removing the
prop (or the Worker) un-enrolls it on the next reconcile.&lt;/p&gt;
&lt;p&gt;At runtime, &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Access.Context&lt;/code&gt; reads the authenticated
identity, and &lt;code dir=&quot;auto&quot;&gt;dev: { access: { identity } }&lt;/code&gt; stubs a logged-in
user under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; so you can test the gated paths locally:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Access&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Context&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;access&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// email, groups, idp…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;identity&lt;/span&gt;&lt;span&gt;?.email })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs:
&lt;a href=&quot;https://alchemy.run/cloudflare/security/access&quot;&gt;Protect a Worker with Access&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;inbound-email-to-workers&quot;&gt;Inbound email to Workers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Workers can now receive email
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/401&quot;&gt;#401&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.email({ zone }).subscribe(handler)&lt;/code&gt; registers the
&lt;code dir=&quot;auto&quot;&gt;email&lt;/code&gt; handler and provisions the zone’s email routing rules for
you:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Inbox&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;({ zone&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt; }).&lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt;((message) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;forward&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ops@example.com&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EmailEventSourceLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/email/email-worker&quot;&gt;Email Workers&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;removal-policies-persist&quot;&gt;Removal policies persist&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;RemovalPolicy.retain()&lt;/code&gt; added to an already-deployed resource
never reached state — the policy is a decoration, not a prop, so
the noop apply path skipped it, and a later rename or removal
orphan-deleted the resource anyway. beta.75 persists the policy
on the noop path
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1253&quot;&gt;#1253&lt;/a&gt;) and
prints a note whenever a deploy flips one.&lt;/p&gt;
&lt;p&gt;Two behavior changes come with it, both protective. Destroying a
non-empty R2 bucket now fails with &lt;code dir=&quot;auto&quot;&gt;BucketNotEmpty&lt;/code&gt; instead of
silently emptying it first — the old behavior deleted 60k objects
in the incident that motivated the fix. Opt disposable buckets
back in explicitly:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { forceDestroy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And because the policy now actually persists, a &lt;code dir=&quot;auto&quot;&gt;retain()&lt;/code&gt; you
&lt;em&gt;removed&lt;/em&gt; from the code takes effect: the next removal deletes
the resource for real. If anything depends on a retain that’s no
longer declared, put it back before deploying.&lt;/p&gt;
&lt;p&gt;Docs:
&lt;a href=&quot;https://alchemy.run/infrastructure-as-code/resource-lifecycle&quot;&gt;Resource lifecycle&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;lambda-docker-functions&quot;&gt;Lambda Docker Functions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.Function&lt;/code&gt; deploys a container image
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1077&quot;&gt;#1077&lt;/a&gt;).
Build from a Dockerfile into a managed ECR repo, or point
&lt;code dir=&quot;auto&quot;&gt;image.uri&lt;/code&gt; at an existing tag or digest. Zip XOR image at the
type level — mixing &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;image&lt;/code&gt; is a compile error.
Thanks &lt;a href=&quot;https://github.com/westerlund&quot;&gt;Simon Westerlund&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ContainerApi&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./lambda&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dockerfile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Dockerfile&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;architecture&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;arm64&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;functionUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.Vocs&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1278&quot;&gt;#1278&lt;/a&gt;) —
first-class Vocs docs sites, also on Fly, Hetzner, and Railway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolated installs bundle&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1324&quot;&gt;#1324&lt;/a&gt;) —
generated entries are shims over real
&lt;code dir=&quot;auto&quot;&gt;alchemy/Runtime/Bootstrap/*&lt;/code&gt; modules, so bun
&lt;code dir=&quot;auto&quot;&gt;--linker=isolated&lt;/code&gt; and pnpm no longer leave Effect programs
crashing at boot with &lt;code dir=&quot;auto&quot;&gt;Cannot find module&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Axiom dataset edge deployments&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1361&quot;&gt;#1361&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;edgeDeployment&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Axiom.Dataset&lt;/code&gt;; OTLP endpoints derive
from Axiom’s regional URL. Thanks
&lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cognito email OTP, CustomEmailSender, and KMS&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1323&quot;&gt;#1323&lt;/a&gt;) —
on &lt;code dir=&quot;auto&quot;&gt;UserPool&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlanetScale Metal SKUs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1319&quot;&gt;#1319&lt;/a&gt;) —
on &lt;code dir=&quot;auto&quot;&gt;PostgresClusterSize&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;r2.dev&lt;/code&gt; managed domain&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1329&quot;&gt;#1329&lt;/a&gt;) —
enable it on &lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.Bucket&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;nuke --local&lt;/code&gt; clears the emulator&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1287&quot;&gt;#1287&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy unsafe nuke --local&lt;/code&gt; enumerates and deletes through
each provider’s &lt;strong&gt;local&lt;/strong&gt; implementation (the floci-emulated
account, the Cloudflare local runtime), so wiping local state
is one command with no cloud credentials in reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hetzner init scripts compose with the bootstrap&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1289&quot;&gt;#1289&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Hetzner.Server.userData&lt;/code&gt; merges into a multipart cloud-init
document alongside alchemy’s bootstrap instead of replacing it,
and changing it plans a replacement (cloud-init only runs on
first boot).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prisma: object storage, locked Postgres state, and deploy
triggers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1061&quot;&gt;#1061&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Prisma.Bucket&lt;/code&gt; + &lt;code dir=&quot;auto&quot;&gt;BucketAccessKey&lt;/code&gt; resources with
&lt;code dir=&quot;auto&quot;&gt;ReadBucket&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;WriteBucket&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;ReadWriteBucket&lt;/code&gt; bindings, a
&lt;code dir=&quot;auto&quot;&gt;State/PostgresState&lt;/code&gt; backend with per-stack advisory locks,
and &lt;code dir=&quot;auto&quot;&gt;Deployment.triggers&lt;/code&gt; to force a redeploy when an opaque
key/value (e.g. a rotated secret) changes. Thanks
&lt;a href=&quot;https://github.com/wmadden&quot;&gt;Will Madden&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured DNS record data&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1257&quot;&gt;#1257&lt;/a&gt;) —
Cloudflare DNS records accept typed component objects for SVCB,
HTTPS, SRV, CAA, and friends via the same &lt;code dir=&quot;auto&quot;&gt;content&lt;/code&gt; prop, with
the shape discriminated by &lt;code dir=&quot;auto&quot;&gt;type&lt;/code&gt;. Thanks
&lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Arya Saatvik&lt;/a&gt;! Adoption also
disambiguates records sharing &lt;code dir=&quot;auto&quot;&gt;(name, type)&lt;/code&gt; by
content/priority instead of clobbering the first match
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1264&quot;&gt;#1264&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker versions carry static assets&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1266&quot;&gt;#1266&lt;/a&gt;) — a
preview version can ship its own assets without touching the
parent deployment. Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;, who also
migrated the workspace to pnpm
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1214&quot;&gt;#1214&lt;/a&gt;),
bumped effect to rc.110 then rc.111
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1245&quot;&gt;#1245&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1318&quot;&gt;#1318&lt;/a&gt;),
made process cleanup explicit and scoped
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1175&quot;&gt;#1175&lt;/a&gt;),
and improved platform runtime detection
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1197&quot;&gt;#1197&lt;/a&gt;)!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Containers reach host services in dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1344&quot;&gt;#1344&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1335&quot;&gt;#1335&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1366&quot;&gt;#1366&lt;/a&gt;) —
loopback env URLs rewrite to the docker host, container images
hot-reload on context/Dockerfile/prop changes, and Linux dev
containers reach loopback host databases through a unix-socket
tunnel instead of the (often firewalled) bridge IP. A failed
&lt;code dir=&quot;auto&quot;&gt;docker build&lt;/code&gt; now fails the dev deploy with docker’s real
error — and a buildx hint when &lt;code dir=&quot;auto&quot;&gt;--load&lt;/code&gt; is the problem —
instead of looping on “Container exited while waiting for port”
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1377&quot;&gt;#1377&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Docker.Container&lt;/code&gt; fixes&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1398&quot;&gt;#1398&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;ports: [{ external: 0 }]&lt;/code&gt; reports the actually-assigned host
port, &lt;code dir=&quot;auto&quot;&gt;extraHosts&lt;/code&gt; forwards as &lt;code dir=&quot;auto&quot;&gt;--add-host&lt;/code&gt;, and reconciliation
only disconnects networks alchemy itself attached instead of
tearing off Docker’s default &lt;code dir=&quot;auto&quot;&gt;bridge&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nested Worker env plans converge&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1273&quot;&gt;#1273&lt;/a&gt;) — a
Worker bound to an already-yielded Worker no longer plans
&lt;code dir=&quot;auto&quot;&gt;update&lt;/code&gt; forever on identical deploys. Thanks
&lt;a href=&quot;https://github.com/odysseaspapadimas&quot;&gt;Odysseas Papadimas&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; survives a broken save&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1259&quot;&gt;#1259&lt;/a&gt;) — a
mid-edit save whose module evaluation throws now logs and waits
for the next change instead of killing the watch session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Env-bound strings deploy bare&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1254&quot;&gt;#1254&lt;/a&gt;) — a
queue name no longer lands in its binding JSON-quoted, so the
dashboard and hand-written env reads see the real value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Runner reaps auto-created log groups on delete&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1327&quot;&gt;#1327&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SvelteKit 3 config shape&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1347&quot;&gt;#1347&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;@sveltejs/kit@3.0.0-next.21+&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process env wins over dotenv defaults&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1355&quot;&gt;#1355&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency security bumps&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1255&quot;&gt;#1255&lt;/a&gt;) —
the vulnerable &lt;code dir=&quot;auto&quot;&gt;extract-zip&lt;/code&gt; and libvips advisories are out of
the runtime’s dependency closure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Worker.domain&lt;/code&gt; pins its zone&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1241&quot;&gt;#1241&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;zoneId&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;zone&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;zoneName&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;, and unpinned hostnames
resolve by name instead of the first page of an account-wide
zone list. Thanks &lt;a href=&quot;https://github.com/benpsnyder&quot;&gt;Ben Snyder&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.Foldkit&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1120&quot;&gt;#1120&lt;/a&gt;) and
&lt;strong&gt;per-workflow step limits&lt;/strong&gt;
(&lt;code dir=&quot;auto&quot;&gt;limits: { steps }&lt;/code&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/816&quot;&gt;#816&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/filipfalcon&quot;&gt;Filip Falcon&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipelines streams bind to Workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1176&quot;&gt;#1176&lt;/a&gt;) — a
stream in &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; becomes a real pipelines binding instead of
falling through to JSON. Thanks
&lt;a href=&quot;https://github.com/spinx&quot;&gt;spinx&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB multi-attribute GSI keys&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1216&quot;&gt;#1216&lt;/a&gt;) —
GSI partition and sort keys composed of up to 4 attributes
each, with order-preserving diffs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS &lt;code dir=&quot;auto&quot;&gt;DBParameterGroup.parameters&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1205&quot;&gt;#1205&lt;/a&gt;) —
engine settings reconciled against live user-modified values.
Thanks &lt;a href=&quot;https://github.com/skusez&quot;&gt;skusez&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda packaging fixes&lt;/strong&gt; — installed packages keep their file
modes and symlinks
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/855&quot;&gt;#855&lt;/a&gt;,
thanks &lt;a href=&quot;https://github.com/jperezrealini&quot;&gt;Joaquín Pérez&lt;/a&gt;!) and
nested &lt;code dir=&quot;auto&quot;&gt;zipCode&lt;/code&gt; archives are byte-deterministic across builds
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1211&quot;&gt;#1211&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro forwards &lt;code dir=&quot;auto&quot;&gt;prerenderEnvironment&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1242&quot;&gt;#1242&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/IMax153&quot;&gt;Maxwell Brown&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The CLI honors &lt;code dir=&quot;auto&quot;&gt;STAGE&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1244&quot;&gt;#1244&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/sethcarlton&quot;&gt;sethcarlton&lt;/a&gt;! And the
version check never suggests a downgrade
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1116&quot;&gt;#1116&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;@effect/vitest&lt;/code&gt; moves to devDependencies&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1191&quot;&gt;#1191&lt;/a&gt;) —
installing alchemy no longer pulls a test toolchain (and its
esbuild peer conflicts) into your resolution. Thanks
&lt;a href=&quot;https://github.com/kristof-siket&quot;&gt;Kristóf Siket&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A missing &lt;code dir=&quot;auto&quot;&gt;.make&lt;/code&gt; Layer names itself&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1055&quot;&gt;#1055&lt;/a&gt;) —
yielding a bare-tag resource without its implementation Layer
dies with a &lt;code dir=&quot;auto&quot;&gt;MissingImplementationError&lt;/code&gt; explaining exactly
what to provide, instead of a &lt;code dir=&quot;auto&quot;&gt;TypeError&lt;/code&gt; deep in a provider.
Thanks &lt;a href=&quot;https://github.com/apostolos-geyer&quot;&gt;apostoli&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Circular Worker layers typecheck&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1199&quot;&gt;#1199&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Worker.make&lt;/code&gt; no longer leaks the other Worker’s tag into
&lt;code dir=&quot;auto&quot;&gt;Layer.mergeAll&lt;/code&gt; requirements. Thanks
&lt;a href=&quot;https://github.com/patrikduksin&quot;&gt;Patrik Duksin&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/railway&quot;&gt;Railway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/railway/tutorial/part-1&quot;&gt;Railway tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/fly&quot;&gt;Fly.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/fly/tutorial/part-1&quot;&gt;Fly.io tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/hetzner&quot;&gt;Hetzner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/hetzner/tutorial/part-1&quot;&gt;Hetzner tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Cloudflare frontends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/frontend/websites&quot;&gt;AWS frontends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/local-development&quot;&gt;AWS local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/security/access&quot;&gt;Protect a Worker with Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.71...main&quot;&gt;Compare v2.0.0-beta.71 → main&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.71 - Effect beta.105 &amp; Better Auth</title><link>https://alchemy.run/blog/2026-08-12-beta-71/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-08-12-beta-71/</guid><description>v2.0.0-beta.71 moves to effect 4.0.0-beta.105 and drizzle 1.0.0-rc.5-ab785fc in lockstep (effect&apos;s TaggedErrorClass → TaggedError rename broke drizzle rc.4), gives @alchemy.run/better-auth an effectful API and a database Layer for every platform, lets Worker props be an Effect, and fixes the ways alchemy dev could serve the wrong app on a configured port.</description><pubDate>Wed, 12 Aug 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alchemy now runs on &lt;strong&gt;effect 4.0.0-beta.105&lt;/strong&gt;, with
&lt;strong&gt;drizzle 1.0.0-rc.5-ab785fc&lt;/strong&gt; bumped in lockstep to survive
effect’s &lt;code dir=&quot;auto&quot;&gt;TaggedErrorClass&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;TaggedError&lt;/code&gt; rename. On top of that, &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/better-auth&lt;/code&gt; gains an
effectful API and a database Layer for every platform, Worker
props can now be an Effect, and a batch of &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; fixes
makes configured ports, queue consumers, and pre-beta.66 state
behave.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-beta.105&lt;/code&gt; is the new minimum peer&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1132&quot;&gt;#1132&lt;/a&gt;).
effect renamed &lt;code dir=&quot;auto&quot;&gt;Schema.TaggedErrorClass&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;Schema.TaggedError&lt;/code&gt;, so earlier betas can no longer resolve.
If you use Drizzle, upgrade &lt;code dir=&quot;auto&quot;&gt;drizzle-orm&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;drizzle-kit&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;1.0.0-rc.5-ab785fc&lt;/code&gt; at the same time — see
&lt;a href=&quot;#effect-beta105-and-the-drizzle-rc5-lockstep&quot;&gt;below&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drizzle backends move out of the &lt;code dir=&quot;auto&quot;&gt;alchemy/Drizzle&lt;/code&gt; barrel&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1119&quot;&gt;#1119&lt;/a&gt;).
Import &lt;code dir=&quot;auto&quot;&gt;alchemy/Drizzle/Postgres&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;alchemy/Drizzle/MySQL&lt;/code&gt;, and
&lt;code dir=&quot;auto&quot;&gt;alchemy/Drizzle/Cloudflare&lt;/code&gt; (Durable Object) directly; the
barrel keeps &lt;code dir=&quot;auto&quot;&gt;Schema&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;providers()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;D1&lt;/code&gt;, and the errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; now serves assets first&lt;/strong&gt; when
&lt;code dir=&quot;auto&quot;&gt;assets.runWorkerFirst&lt;/code&gt; is omitted
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1121&quot;&gt;#1121&lt;/a&gt;),
matching the deployed default. A worker that intercepts
asset-path requests in dev must opt in explicitly with
&lt;code dir=&quot;auto&quot;&gt;assets: { runWorkerFirst: true }&lt;/code&gt; — such apps already behaved
assets-first in production, so the old dev default was masking
a dev/prod divergence.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-beta105-and-the-drizzle-rc5-lockstep&quot;&gt;effect beta.105 and the drizzle rc.5 lockstep&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;effect &lt;code dir=&quot;auto&quot;&gt;4.0.0-beta.105&lt;/code&gt; renamed &lt;code dir=&quot;auto&quot;&gt;Schema.TaggedErrorClass&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;Schema.TaggedError&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TaggedErrorClass&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;AuthError&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TaggedError&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;AuthError&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;AuthError&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ message&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;drizzle-orm &lt;code dir=&quot;auto&quot;&gt;1.0.0-rc.4&lt;/code&gt; — which ships effect-native clients built
on that API — broke against it, which pinned the entire dependency
tree: you couldn’t take the effect upgrade without breaking
drizzle, and vice versa. Drizzle’s &lt;code dir=&quot;auto&quot;&gt;1.0.0-rc.5-ab785fc&lt;/code&gt; release
ships &lt;code dir=&quot;auto&quot;&gt;TaggedError&lt;/code&gt; natively, so beta.71 upgrades both in lockstep
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1132&quot;&gt;#1132&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1184&quot;&gt;#1184&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;effect&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&gt;=4.0.0-beta.102&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;drizzle-orm&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.0.0-rc.4&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;drizzle-kit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.0.0-rc.4&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;effect&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&gt;=4.0.0-beta.105&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;drizzle-orm&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.0.0-rc.5-ab785fc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;drizzle-kit&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1.0.0-rc.5-ab785fc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;When you upgrade, pin drizzle exactly — a &lt;code dir=&quot;auto&quot;&gt;^1.0.0-rc.4&lt;/code&gt; range can
still hand you the rc.4 that breaks against effect beta.105.&lt;/p&gt;
&lt;p&gt;Alongside the version bump, the optional Drizzle drivers now load
lazily (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1119&quot;&gt;#1119&lt;/a&gt;)
— importing the Postgres or MySQL client no longer requires
&lt;code dir=&quot;auto&quot;&gt;@effect/sql-mysql2&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;@effect/sql-pg&lt;/code&gt; to be installed unless you
actually connect:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Drizzle&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Drizzle/Postgres&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt;.connectionString&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { relations })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL &amp;#x26; Drizzle&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;better-auth-every-database-effectful-api&quot;&gt;Better Auth: every database, effectful API&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/better-auth&lt;/code&gt; now supports every storage backend and
wraps Better Auth’s async API in an effectful interface
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1157&quot;&gt;#1157&lt;/a&gt;):
&lt;code dir=&quot;auto&quot;&gt;yield* BetterAuth(options)&lt;/code&gt; gives you a fully-typed auth
instance, and the database is a Layer you pick per platform.
Plugin typing flows end-to-end — every &lt;code dir=&quot;auto&quot;&gt;auth.api.*&lt;/code&gt; endpoint is an
Effect with a tagged &lt;code dir=&quot;auto&quot;&gt;BetterAuthApiError&lt;/code&gt; — and schema migrations
run automatically at deploy as an alchemy Action, input-hash
diffed and tree-shaken out of runtime bundles.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BetterAuth&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;basePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/auth&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;emailAndPassword&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;anonymous&lt;/span&gt;&lt;span&gt;()]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// auth.api.signInAnonymous is now typed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// serve the Better Auth routes on Workers and Lambda unchanged&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/auth&quot;&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;.fetch&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// or call endpoints directly — typed errors, set-cookie preserved&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;signInEmail&lt;/span&gt;&lt;span&gt;({ body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { email&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; password } }).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;catchTag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;BetterAuthApiError&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (e) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// e.statusCode, e.body.code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The database Layers cover every environment → target pair:
&lt;code dir=&quot;auto&quot;&gt;CloudflareD1&lt;/code&gt; (native binding + migrations over the D1 HTTP API,
local simulator included), &lt;code dir=&quot;auto&quot;&gt;Neon&lt;/code&gt; (serverless driver over
WebSocket — no Hyperdrive, no &lt;code dir=&quot;auto&quot;&gt;pg&lt;/code&gt;), &lt;code dir=&quot;auto&quot;&gt;AuroraDataApi&lt;/code&gt; (SQL over
HTTPS with IAM — no VPC attachment), &lt;code dir=&quot;auto&quot;&gt;CloudflareHyperdrive&lt;/code&gt;,
generic &lt;code dir=&quot;auto&quot;&gt;Postgres&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;MySQL&lt;/code&gt; TCP fallbacks (PlanetScale, RDS,
any connection string), &lt;code dir=&quot;auto&quot;&gt;SQLite&lt;/code&gt; for local dev, &lt;code dir=&quot;auto&quot;&gt;Memory&lt;/code&gt; for
tests, and &lt;code dir=&quot;auto&quot;&gt;Drizzle&lt;/code&gt; to bring your own db via better-auth’s
official adapter.&lt;/p&gt;
&lt;p&gt;Because the database is a Layer, your auth code never changes —
you swap the provided Layer. On D1:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;CloudflareD1&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@alchemy.run/better-auth/CloudflareD1&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AuthDb&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;AuthWorker&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;AuthWorker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BetterAuth&lt;/span&gt;&lt;span&gt;({ emailAndPassword&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; } })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/auth&quot;&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;.fetch&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CloudflareD1&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Moving to PlanetScale Postgres is only a Layer swap — the
&lt;code dir=&quot;auto&quot;&gt;BetterAuth&lt;/code&gt; program is untouched:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;CloudflareD1&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@alchemy.run/better-auth/CloudflareD1&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@alchemy.run/better-auth/Postgres&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AuthDb&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Planetscale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PostgresDatabase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AuthDb&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthRole&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Planetscale&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PostgresRole&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AuthRole&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { database&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthDatabase&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AuthRole&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (role) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;.connectionUrl))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AuthWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;AuthWorker&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;AuthWorker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BetterAuth&lt;/span&gt;&lt;span&gt;({ emailAndPassword&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; } })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;...,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CloudflareD1&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AuthDb&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AuthDatabase&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The API reference also learned to document Layers as first-class
pages (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1159&quot;&gt;#1159&lt;/a&gt;)
— each database Layer gets its own generated page declaring what
it provides and its peer dependencies.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/better-auth&quot;&gt;Better Auth&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-dev-fixes&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; fixes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A configured dev port could serve the wrong app
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1129&quot;&gt;#1129&lt;/a&gt;): the
proxy bound only &lt;code dir=&quot;auto&quot;&gt;127.0.0.1&lt;/code&gt;, browsers prefer &lt;code dir=&quot;auto&quot;&gt;::1&lt;/code&gt;, and any
framework dev server hunting from its default port could squat
the IPv6 half of &lt;code dir=&quot;auto&quot;&gt;localhost&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;proxy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;listening&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;127.0.0.1:3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;vite&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;binds&lt;/span&gt;&lt;span&gt; [::1]:3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;http://localhost:3000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;→&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wrong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The proxy now owns its port on both address families, and a dev
restart no longer cascades every configured port in the stack up
by one.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt; bindings no longer go stale
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1139&quot;&gt;#1139&lt;/a&gt;) —
Cloudflare’s edge preview was pinning the remote-binding proxy to
sessions pointing at destroyed resources, 400ing every proxied
KV/R2/D1 call for up to 50 minutes.&lt;/p&gt;
&lt;p&gt;Framework production builds run in disposable child processes
with &lt;code dir=&quot;auto&quot;&gt;NODE_ENV=production&lt;/code&gt; pinned
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1139&quot;&gt;#1139&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1178&quot;&gt;#1178&lt;/a&gt;), so
user config and plugins can &lt;code dir=&quot;auto&quot;&gt;chdir&lt;/code&gt;, mutate &lt;code dir=&quot;auto&quot;&gt;process.env&lt;/code&gt;, or
crash without taking the engine with them.&lt;/p&gt;
&lt;p&gt;And every local worker announces where it’s serving as it comes
up:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[api-worker] ready at http://localhost:1337&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;state-from-older-versions-recovers-automatically&quot;&gt;State from older versions recovers automatically&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Stacks that mixed &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; on versions
before beta.66 could end up with state the engine no longer knew
how to handle — deploys and destroys failing forever with errors
like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;BadRequest: There is a malformed parameter in the request&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Cloudflare queue &quot;jobs&quot; already has a worker consumer for script&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;worker-t2po...&quot;, but this resource is configured for &quot;worker-qwh3...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;beta.71 recognizes these situations and repairs them on your next
run: old dev-mode state is routed to the local simulator instead
of the real Cloudflare API
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1130&quot;&gt;#1130&lt;/a&gt;),
resources deployed before beta.66 are properly replaced — not
silently abandoned — when you run dev
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1110&quot;&gt;#1110&lt;/a&gt;), and
queue/consumer wiring left behind by old runs is reattached or
cleaned up
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1133&quot;&gt;#1133&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare tooling moves into the monorepo&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1122&quot;&gt;#1122&lt;/a&gt;) —
the runtime and framework adapters are now
&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/cloudflare-runtime&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/cloudflare-frameworks&lt;/code&gt;, developed, tested, and
released with alchemy itself. Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue consumers work on &lt;code dir=&quot;auto&quot;&gt;Website.Vite&lt;/code&gt; workers in dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1113&quot;&gt;#1113&lt;/a&gt;) —
consumer wiring survives the Vite child’s boot order, and
&lt;code dir=&quot;auto&quot;&gt;send()&lt;/code&gt; to a queue with no running consumer resolves instead
of hanging forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local queue consumers honor batch settings&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1126&quot;&gt;#1126&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;batchSize&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;maxWaitTimeMs&lt;/code&gt; now map onto the local broker’s
field names instead of being silently ignored.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asset serving fixes&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1121&quot;&gt;#1121&lt;/a&gt;) —
the asset MIME table covers the full extension set (avif, webp,
woff2, … previously &lt;code dir=&quot;auto&quot;&gt;application/octet-stream&lt;/code&gt;), and asset
hashes include the extension so identical bodies under
different extensions keep distinct content types. One-time
effect: all assets re-upload on your next deploy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker containers receive their environment values&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1118&quot;&gt;#1118&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;environment&lt;/code&gt; entries resolved empty inside the container,
breaking e.g. PostgreSQL bootstrap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InternetGateway detach rides out lingering ENIs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1125&quot;&gt;#1125&lt;/a&gt;) —
Fargate and Lambda ENIs can hold public IPs for 5–20 minutes
after their owner is deleted; the detach now waits them out
instead of leaving an IGW+VPC residue on destroy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-generated names avoid reserved prefixes&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1186&quot;&gt;#1186&lt;/a&gt;) —
stacks named &lt;code dir=&quot;auto&quot;&gt;aws-*&lt;/code&gt; produced physical names that Resource
Groups, S3 Tables, and S3 Vectors reject; colliding prefixes
are now escaped, and non-colliding names are byte-for-byte
unchanged.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dates persist correctly in state&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1164&quot;&gt;#1164&lt;/a&gt;) —
a &lt;code dir=&quot;auto&quot;&gt;Date&lt;/code&gt;-typed prop used to serialize as &lt;code dir=&quot;auto&quot;&gt;{}&lt;/code&gt; in durable state
stores, churning a phantom update on every subsequent plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/better-auth&quot;&gt;Better Auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL &amp;#x26; Drizzle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta71&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.70...v2.0.0-beta.71&quot;&gt;Compare v2.0.0-beta.70 → v2.0.0-beta.71&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.70 - Web Frameworks &amp; Full Local Dev</title><link>https://alchemy.run/blog/2026-08-06-beta-70/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-08-06-beta-70/</guid><description>v2.0.0-beta.70 deploys Next.js, Astro, Nuxt, SvelteKit, Waku, and Octane to Cloudflare Workers with zero Cloudflare-specific config, completes local emulation in alchemy dev (browser rendering, images, email, cron, secrets, Stream, tail consumers), adds renamedFrom() state migration for logical ID renames, plan-time data sources, cluster-agnostic Kubernetes workloads, MySQL clients, and migrates every SDK to distilled v1.</description><pubDate>Thu, 06 Aug 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.70 deploys &lt;strong&gt;Next.js, Astro, Nuxt, SvelteKit, Waku, and
Octane&lt;/strong&gt; to Cloudflare Workers — programmatic builds, no
&lt;code dir=&quot;auto&quot;&gt;wrangler.json&lt;/code&gt;, no adapter config. And &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; now emulates
effectively the entire Cloudflare surface locally: browser
rendering, image transforms, email, cron triggers, secrets,
Stream, and tail consumers join KV, R2, D1, and Queues. The
release also adds plan-time data sources, moves Kubernetes
workloads out of EKS into a cluster-agnostic namespace, and
migrates every SDK to distilled v1.&lt;/p&gt;
&lt;p&gt;This post covers beta.67 through beta.70 — beta.67 was a small
fix release that didn’t get its own notes, and beta.68/beta.69
are superseded by beta.70.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Behavior change&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.StaticSite&lt;/code&gt; no longer duplicates &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;
resources into its own namespace
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1053&quot;&gt;#1053&lt;/a&gt;) — a
shared KV namespace passed as &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; used to register a second
physical copy at &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;site-id&gt;/…&lt;/code&gt;. As part of the fix, the site’s
Worker moves from the &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;id&gt;/Worker&lt;/code&gt; FQN to &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;id&gt;&lt;/code&gt; — and thanks to
the new &lt;a href=&quot;#rename-resources-with-renamedfrom&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;renamedFrom()&lt;/code&gt;&lt;/a&gt;
support, its state migrates in place on your next deploy: same
physical name, same &lt;code dir=&quot;auto&quot;&gt;workers.dev&lt;/code&gt; subdomain, nothing recreated.
Thanks &lt;a href=&quot;https://github.com/apostolos-geyer&quot;&gt;apostoli&lt;/a&gt;!&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;the-website-family-six-new-frameworks&quot;&gt;The Website family: six new frameworks&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website&lt;/code&gt; grows from Vite and StaticSite to a full
framework family:
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/nextjs&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Nextjs&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/923&quot;&gt;#923&lt;/a&gt;),
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/astro&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Astro&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/nuxt&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Nuxt&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/sveltekit&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;SvelteKit&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/waku&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Waku&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1086&quot;&gt;#1086&lt;/a&gt;), and
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/octane&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Octane&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1093&quot;&gt;#1093&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Every resource builds your project programmatically — no wrangler
binary, no &lt;code dir=&quot;auto&quot;&gt;wrangler.json&lt;/code&gt;, no adapter packages to install — and
deploys it as a Worker: server bundle plus static assets. Your
framework’s own config file (&lt;code dir=&quot;auto&quot;&gt;astro.config.*&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;vite.config.ts&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;nuxt.config.ts&lt;/code&gt;, …) loads natively; Alchemy merges its
Cloudflare config over it. Builds are memoized by content-hashing
the input files, so an unchanged project skips the build and
deploy entirely.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Nextjs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;GREETING&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Hello from Alchemy!&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;UPLOADS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bucket&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// any binding, via getCloudflareContext().env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each resource returns a plain &lt;code dir=&quot;auto&quot;&gt;Worker&lt;/code&gt;, so the entire Worker
vocabulary applies: &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; takes any binding (KV, R2, Durable
Objects, secrets), plus &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;compatibility&lt;/code&gt;, and asset
routing. Framework specifics are handled per resource:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; builds through the OpenNext pipeline. With a KV
incremental cache and a Durable Object queue, &lt;strong&gt;writable ISR&lt;/strong&gt;
fully works — time-based regeneration and on-demand
&lt;code dir=&quot;auto&quot;&gt;revalidatePath&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Nextjs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NEXT_INC_CACHE_KV&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; incCache&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NEXT_TAG_CACHE_KV&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; tagCache&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NEXT_CACHE_DO_QUEUE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NEXT_CACHE_DO_QUEUE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;DOQueueHandler&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// ships in the OpenNext bundle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt; defaults to server output and auto-provisions a KV
namespace for zero-config
&lt;a href=&quot;https://docs.astro.build/en/guides/sessions/&quot;&gt;sessions&lt;/a&gt;, bound
as &lt;code dir=&quot;auto&quot;&gt;SESSION&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;CACHE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; kv&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UPLOADS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bucket }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// via Astro.locals.runtime.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Nuxt&lt;/strong&gt; builds through nitro’s &lt;code dir=&quot;auto&quot;&gt;cloudflare_module&lt;/code&gt; preset and
natively loads your &lt;code dir=&quot;auto&quot;&gt;nuxt.config.ts&lt;/code&gt; — the &lt;code dir=&quot;auto&quot;&gt;nuxt&lt;/code&gt; prop merges
over it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Nuxt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nuxt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { routeRules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;/about&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { prerender&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; } } }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;SvelteKit&lt;/strong&gt; uses an in-memory Cloudflare adapter — no
&lt;code dir=&quot;auto&quot;&gt;svelte.config.js&lt;/code&gt; changes, no &lt;code dir=&quot;auto&quot;&gt;@sveltejs/adapter-cloudflare&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SvelteKit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;API_KEY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span&gt;) }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// via platform.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Waku&lt;/strong&gt; serves RSC SSR at request time and prerenders SSG pages
at build time inside workerd. A custom entry can even host
Durable Objects alongside waku’s fetch handler:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Waku&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;App&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;src/worker-entry.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// optional custom entry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;COUNTER&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span&gt;) }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Octane&lt;/strong&gt; deploys &lt;a href=&quot;https://octanejs.dev&quot;&gt;OctaneJS&lt;/a&gt; fullstack
apps through Octane’s own Cloudflare adapter:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Octane&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;CACHE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cache }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// via context.platform.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All six run under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; on their framework’s own dev
server — Turbopack HMR for Next.js (&lt;code dir=&quot;auto&quot;&gt;nextjs: { devMode: &quot;hmr&quot; }&lt;/code&gt;,
or the default preview parity under workerd), Vite HMR for the
rest — with real bindings resolved in-process.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Frontend frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-dev-covers-the-whole-surface&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; covers the whole surface&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;beta.66 emulated KV, R2, D1, and Queues locally. beta.70 finishes
the campaign
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1039&quot;&gt;#1039&lt;/a&gt;) —
miniflare parity and beyond:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cron triggers fire in dev&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;crons&lt;/code&gt; schedule real timers,
and the miniflare-compatible &lt;code dir=&quot;auto&quot;&gt;/cdn-cgi/handler/scheduled&lt;/code&gt; route
triggers them manually. Previously &lt;code dir=&quot;auto&quot;&gt;scheduled()&lt;/code&gt; never ran under
&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser Rendering&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;env.BROWSER&lt;/code&gt; drives a real local Chrome
over CDP; &lt;code dir=&quot;auto&quot;&gt;@cloudflare/puppeteer&lt;/code&gt; works unchanged.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;env.IMAGES&lt;/code&gt; transforms run through sharp locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email, both directions&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;send_email&lt;/code&gt; validates and persists
sent mail as &lt;code dir=&quot;auto&quot;&gt;.eml&lt;/code&gt; files, and a &lt;code dir=&quot;auto&quot;&gt;POST&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;/cdn-cgi/handler/email&lt;/code&gt; drives your &lt;code dir=&quot;auto&quot;&gt;email()&lt;/code&gt; handler with
accept, reject, and reply semantics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets Store&lt;/strong&gt; — a Worker binding a &lt;code dir=&quot;auto&quot;&gt;secrets_store_secret&lt;/code&gt;
now boots in dev, with the real (Redacted-sourced) value seeded
into the simulator. &lt;code dir=&quot;auto&quot;&gt;secret_key&lt;/code&gt; CryptoKey bindings boot too,
and gain a user-facing resource: &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workers.SecretKey&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stream&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Stream.Stream(&quot;STREAM&quot;)&lt;/code&gt; is a new
binding surface entirely (alchemy previously had none), working
live and against a local video-store simulator in dev.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tail consumers&lt;/strong&gt; — the new &lt;code dir=&quot;auto&quot;&gt;tailConsumers&lt;/code&gt; prop uploads as
&lt;code dir=&quot;auto&quot;&gt;tail_consumers&lt;/code&gt; metadata live, and a local producer’s trace
events reach a local tail Worker in dev.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflows and Hyperdrive&lt;/strong&gt; are now first-class dual providers,
so switching between dev and deploy is an engine-orchestrated
replacement instead of ad-hoc branching.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt; is now the single way to opt a binding onto the
real cloud during dev
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1065&quot;&gt;#1065&lt;/a&gt;).
Worker-only bindings gained &lt;code dir=&quot;auto&quot;&gt;pipe()&lt;/code&gt;, so the same aspect works on
plain binding values in an async Worker’s &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Effect-native Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browser&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Browser&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;BROWSER&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// async Worker env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;IMAGES&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;IMAGES&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;()) }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And local and live compose into &lt;strong&gt;hybrid topologies&lt;/strong&gt;. Pin a queue
live and everything around it stays local — the local Worker
produces real messages into the real queue, and its local consumer
drains the same queue through a pull loop, with the usual
batching, retry, and dead-letter semantics:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// the queue is real, even in dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Jobs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Jobs&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// the worker is local: it produces into the real queue, and its&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// consumer drains the real queue through a pull loop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Processor&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// subscribe and process messages from the real queue in the local worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeQueueMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (stream) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runForEach&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;stream&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (msg) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processJob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span&gt;.body))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Your dev session sees the same traffic as staging — messages
produced by deployed services or a teammate’s session land in
your local handler, and your local edits process them instantly.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;vite-dev-servers-run-in-child-processes&quot;&gt;Vite dev servers run in child processes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;, every Vite dev server now runs in its own
child process
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1076&quot;&gt;#1076&lt;/a&gt;)
because much of Vite’s plugin ecosystem resolves paths against
&lt;code dir=&quot;auto&quot;&gt;process.cwd()&lt;/code&gt;. Config loaders, framework plugins, and tailwind
all broke when the stack ran from a different directory than the
site. Each server now gets its project root as its working
directory, so all of that just works, and multiple sites in one
stack no longer interfere with each other.&lt;/p&gt;
&lt;p&gt;Each server’s output streams into the dev console prefixed with
its worker name, so interleaved logs from several sites stay
readable. The work also surfaced an upstream Vite bug in
&lt;code dir=&quot;auto&quot;&gt;server.port&lt;/code&gt; handling, fixed in
&lt;a href=&quot;https://github.com/vitejs/vite/pull/23158&quot;&gt;vitejs/vite#23158&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rename-resources-with-renamedfrom&quot;&gt;Rename resources with &lt;code dir=&quot;auto&quot;&gt;renamedFrom()&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Changing a resource’s logical ID used to plan a &lt;strong&gt;replacement&lt;/strong&gt; —
a new resource created under the new ID, the old one (and its
data) deleted. &lt;code dir=&quot;auto&quot;&gt;Alchemy.renamedFrom&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1108&quot;&gt;#1108&lt;/a&gt;)
declares the id(s) a resource was previously registered under, and
the engine migrates the persisted state row instead:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Bucket&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Assets&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;renamedFrom&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Bucket&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The next deploy plans a single re-branding update — same instance
ID, same physical name, nothing created or deleted in the cloud:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Plan: 1 to update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Assets] update (renamed from Bucket)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A bare string resolves against the ambient namespace exactly like
the &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; argument; &lt;code dir=&quot;auto&quot;&gt;{ fqn: &quot;...&quot; }&lt;/code&gt; addresses a move between
namespaces; listing several former ids covers rename chains. The
migration is deliberately conservative — types must match,
ambiguous claims and rename cycles fail the plan, and a leftover
row from an interrupted move is dropped state-only, never touching
the cloud. This is what lets the StaticSite fix above migrate
&lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;id&gt;/Worker&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;id&gt;&lt;/code&gt; without replacing your Worker.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-code/renaming&quot;&gt;Renaming Resources&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;data-sources-plan-time-execute&quot;&gt;Data sources: plan-time &lt;code dir=&quot;auto&quot;&gt;execute&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every &lt;code dir=&quot;auto&quot;&gt;Binding.Service&lt;/code&gt; gains &lt;code dir=&quot;auto&quot;&gt;execute(...)&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1037&quot;&gt;#1037&lt;/a&gt;) —
invoke a capability at plan/deploy time and get an &lt;code dir=&quot;auto&quot;&gt;Output&lt;/code&gt;, the
Terraform data-source / Pulumi invoke shape. &lt;code dir=&quot;auto&quot;&gt;AWS.EC2.getAmi&lt;/code&gt; is
the first:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Instance&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;web&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;imageId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getAmi&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owners&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;amazon&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;al2023-ami-2023.*&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;ImageId&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;as&amp;#x3C;string&gt;&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instanceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;t3.micro&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;subnetId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subnet&lt;/span&gt;&lt;span&gt;.subnetId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The same contract still works as a runtime binding — &lt;code dir=&quot;auto&quot;&gt;yield* AWS.EC2.GetAmi(opts)&lt;/code&gt; inside a Function grants
&lt;code dir=&quot;auto&quot;&gt;ec2:DescribeImages&lt;/code&gt; and looks images up at runtime. One
capability, two execution times.&lt;/p&gt;
&lt;p&gt;Cloudflare VPC services use the same shape
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/821&quot;&gt;#821&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/filipfalcon&quot;&gt;Filip Falcon&lt;/a&gt;!) —
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.VpcService.lookup({ name })&lt;/code&gt; resolves a service
managed outside the stack, and binding it (or a managed
&lt;code dir=&quot;auto&quot;&gt;VpcService&lt;/code&gt;) to a Worker’s &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; yields a &lt;code dir=&quot;auto&quot;&gt;Fetcher&lt;/code&gt; that tunnels
into your private network:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/worker.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;VPC&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;VpcService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lookup&lt;/span&gt;&lt;span&gt;({ name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-vpc-service&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings — data sources&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kubernetes-goes-cluster-agnostic&quot;&gt;Kubernetes goes cluster-agnostic&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Kubernetes workloads from beta.64 move out of &lt;code dir=&quot;auto&quot;&gt;AWS.EKS.*&lt;/code&gt;
into a new &lt;code dir=&quot;auto&quot;&gt;alchemy/Kubernetes&lt;/code&gt; namespace
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/986&quot;&gt;#986&lt;/a&gt;):
&lt;code dir=&quot;auto&quot;&gt;Deployment&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Job&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Manifest&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;HelmChart&lt;/code&gt; reference a
cluster instead of being EKS resources. Pass an &lt;code dir=&quot;auto&quot;&gt;AWS.EKS.Cluster&lt;/code&gt;
and auth (SigV4), the image registry (ECR), and workload identity
(Pod Identity) resolve through its adapter — or point at anything
&lt;code dir=&quot;auto&quot;&gt;kubectl&lt;/code&gt; can reach:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Kubernetes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KubeConfig&lt;/span&gt;&lt;span&gt;({ context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;kind-dev&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Kubernetes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Deployment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; local&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ghcr.io/acme/api:v3&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Exec credential plugins (&lt;code dir=&quot;auto&quot;&gt;aws eks get-token&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;kubelogin&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;gke-gcloud-auth-plugin&lt;/code&gt;) are honored, so EKS today and AKS/GKE
via kubeconfig immediately. Add &lt;code dir=&quot;auto&quot;&gt;Kubernetes.providers()&lt;/code&gt; to your
stack; the old &lt;code dir=&quot;auto&quot;&gt;AWS.EKS.Deployment&lt;/code&gt;-style exports keep compiling
for one release as deprecated aliases, and existing state migrates
in place.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;distilled-v1&quot;&gt;distilled v1&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Every cloud API alchemy talks to goes through a
&lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled&lt;/a&gt; SDK — typed
Effect clients with every error in the type-level union. Until
now, each provider’s SDK came out of its own hand-rolled
generator: one for Cloudflare, one for AWS, one for each
OpenAPI-shaped API, each with its own quirks and its own bugs.&lt;/p&gt;
&lt;p&gt;distilled v1 replaces all of that with &lt;strong&gt;one compiler&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/823&quot;&gt;#823&lt;/a&gt;). Every
provider’s native spec format — OpenAPI (shared by 13 providers),
Cloudflare’s API docs, AWS’s official Smithy models, Google
Discovery, Azure ARM, GraphQL introspection — is first converted
into a standard &lt;a href=&quot;https://smithy.io&quot;&gt;Smithy&lt;/a&gt; model, and a single
Smithy-to-SDK codegen compiles every model into its Effect client.
Each provider package is just data: a spec converter config, a
small trait/pagination/protocol vocabulary (Cloudflare’s is ~115
lines), and a thin runtime protocol seam (SigV4 for AWS, a
generic bearer-REST protocol shared by 12 providers).&lt;/p&gt;
&lt;p&gt;The result is 20 packages and ~45k operations — 429 AWS services,
all of Azure and GCP, Cloudflare, Kubernetes, Stripe, PostHog, and
the long tail — all built, patched, and regenerated through the
same pipeline. Fixing a mistyped error or a wrong response schema
is now one JSON Patch against a Smithy model, in the same dialect
regardless of provider, and adding a whole new provider is a spec
config rather than a new generator.&lt;/p&gt;
&lt;p&gt;The migration was verified name-for-name against the v0 surfaces
and by alchemy’s full live test tree — nearly 6,000 tests against
real cloud APIs — with zero SDK regressions.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;mysql-for-effect-sql-and-drizzle&quot;&gt;MySQL for effect-sql and Drizzle&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;SQL.MySQL&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Drizzle.MySQL&lt;/code&gt; complete the SQL client matrix
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1063&quot;&gt;#1063&lt;/a&gt;) — the
missing siblings of the Postgres and D1 clients:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/SQL/MySQL&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Hyperdrive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Hyperdrive&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MySQL&lt;/span&gt;&lt;span&gt;({ url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hd&lt;/span&gt;&lt;span&gt;.connectionString })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT * FROM users`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;On workerd the client automatically switches to MySQL’s text
protocol (Hyperdrive’s proxy has no prepared statements) and
eval-free row parsers; Lambda and containers keep prepared
statements. Same lazy per-request pool lifecycle as Postgres.
Docs: &lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workerentrypoint-bindings&quot;&gt;WorkerEntrypoint bindings&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Bind a specific &lt;code dir=&quot;auto&quot;&gt;WorkerEntrypoint&lt;/code&gt; class exported by another
Worker — with optional &lt;code dir=&quot;auto&quot;&gt;ctx.props&lt;/code&gt; riding along
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1097&quot;&gt;#1097&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caller&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Caller&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/caller.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt;(target&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;VENDOR&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkerEntrypoint&lt;/span&gt;&lt;span&gt;(vendor&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;entrypoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Vendor&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { baseUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// → the target&apos;s ctx.props&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; delivers &lt;code dir=&quot;auto&quot;&gt;ctx.props&lt;/code&gt; to the local target today.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;pure-annotations-are-opt-in-only&quot;&gt;Pure annotations are opt-in only&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The bundler annotates discarded-result calls as pure so
minification can tree-shake them — that’s what keeps effect’s
unused modules out of your Worker. It used to auto-extend that
treatment to your own package when it declared
&lt;code dir=&quot;auto&quot;&gt;sideEffects: false&lt;/code&gt;, which could delete top-level registrations
like &lt;code dir=&quot;auto&quot;&gt;app.get(&quot;/&quot;, handler)&lt;/code&gt; under minification: the deploy
succeeds, unbundled unit tests stay green, and every request
404s.&lt;/p&gt;
&lt;p&gt;Auto-detection is removed entirely
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1021&quot;&gt;#1021&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/danielgangl&quot;&gt;Daniel Gangl&lt;/a&gt;! &lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;@effect/*&lt;/code&gt;, and alchemy’s own packages stay annotated by
default; any other package is only touched when you list it
deliberately:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pure&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { packages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;my-lib&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@my-scope/*&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// or pure: false to disable annotation entirely&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access-managed OAuth applications&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1023&quot;&gt;#1023&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;oauthConfiguration&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Access.Application&lt;/code&gt;, including dynamic
client registration for MCP-style clients. Thanks
&lt;a href=&quot;https://github.com/magoz&quot;&gt;Magoz&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typed Access IdP configs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1002&quot;&gt;#1002&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;IdentityProvider&lt;/code&gt; props are a discriminated union on &lt;code dir=&quot;auto&quot;&gt;type&lt;/code&gt;, so
an &lt;code dir=&quot;auto&quot;&gt;azureAD&lt;/code&gt; IdP missing &lt;code dir=&quot;auto&quot;&gt;directoryId&lt;/code&gt; is a compile error; plus
zone scope and SAML certificate sets. Adoption of IdPs with
empty display names is fixed and &lt;code dir=&quot;auto&quot;&gt;getIdentityProvider&lt;/code&gt; joins as
a data source
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1099&quot;&gt;#1099&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SESv2 sending coverage&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/976&quot;&gt;#976&lt;/a&gt;) —
identity policies, contact lists, tenants, dedicated IPs, and
account settings: 9 resources and 5 bindings. Thanks
&lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Arya Saatvik&lt;/a&gt; (who also
repaired the AWS utility subpath exports in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1033&quot;&gt;#1033&lt;/a&gt;)!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative Lambda versions&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/993&quot;&gt;#993&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.Version&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Alias&lt;/code&gt;, retain-by-default for
production-safe Durable Function deployments. Thanks again
&lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Arya Saatvik&lt;/a&gt;! The engine now
re-resolves whole-resource references at apply so downstream
resources see fresh upstream attributes
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1068&quot;&gt;#1068&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1070&quot;&gt;#1070&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy state export&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1043&quot;&gt;#1043&lt;/a&gt;) —
every state record across stacks and stages as one JSON
document, deterministically ordered so exports diff cleanly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drizzle on Durable Object SQLite&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1031&quot;&gt;#1031&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Drizzle.DurableObject&lt;/code&gt; applies drizzle-kit migrations inside a
DO, and &lt;code dir=&quot;auto&quot;&gt;.sql&lt;/code&gt; imports bundle as text modules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda &lt;code dir=&quot;auto&quot;&gt;build.install&lt;/code&gt; pins from lockfiles&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/858&quot;&gt;#858&lt;/a&gt;) — the
installed dependency graph is resolved against your lockfile
(npm, pnpm, bun, yarn) via generated &lt;code dir=&quot;auto&quot;&gt;overrides&lt;/code&gt;, so deployed
artifacts can’t drift. Thanks
&lt;a href=&quot;https://github.com/jperezrealini&quot;&gt;Joaquín Pérez&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect error responses reach the client&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1011&quot;&gt;#1011&lt;/a&gt;) — a
failed handler’s &lt;code dir=&quot;auto&quot;&gt;HttpServerResponse&lt;/code&gt; is preserved instead of
being flattened to a bare 500. Thanks
&lt;a href=&quot;https://github.com/patrikduksin&quot;&gt;Patrik Duksin&lt;/a&gt; (who also fixed
local D1 migrations in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1009&quot;&gt;#1009&lt;/a&gt;)!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engine reliability&lt;/strong&gt; — an interrupted first deploy no longer
bricks later plans with a &lt;code dir=&quot;auto&quot;&gt;SchemaError&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1005&quot;&gt;#1005&lt;/a&gt;), and
cyclic props and class instances no longer send the engine’s
prop walkers into infinite recursion
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1094&quot;&gt;#1094&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCI Helm charts parse correctly&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1042&quot;&gt;#1042&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/microagi-andy&quot;&gt;Andy Jefferson&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlanetScale migrations split same-line breakpoint markers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1062&quot;&gt;#1062&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/beeirl&quot;&gt;BEEIRL&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website &amp;#x26; Vite fixes&lt;/strong&gt; — the assets directory is hashed during
plan diff so asset-only changes deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1045&quot;&gt;#1045&lt;/a&gt;),
Vite’s &lt;code dir=&quot;auto&quot;&gt;base&lt;/code&gt; applies to the assets manifest
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1048&quot;&gt;#1048&lt;/a&gt;),
Website uses the proper domain object with redirects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1088&quot;&gt;#1088&lt;/a&gt;), dev
child ports are allocated ephemerally
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1090&quot;&gt;#1090&lt;/a&gt;), and
relative &lt;code dir=&quot;auto&quot;&gt;rootDir&lt;/code&gt;s hash stably
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1079&quot;&gt;#1079&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;, who
also fixed relative DNS record matching in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1017&quot;&gt;#1017&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prisma provider aligned with the management API&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1012&quot;&gt;#1012&lt;/a&gt;) —
thanks &lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;pg&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;mysql2&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;mongodb&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;@vercel/nft&lt;/code&gt; are optional
peer dependencies&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1069&quot;&gt;#1069&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1071&quot;&gt;#1071&lt;/a&gt;) —
install only what you use.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Frontend frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-code/renaming&quot;&gt;Renaming Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/eks&quot;&gt;EKS &amp;#x26; Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta70&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.66...v2.0.0-beta.70&quot;&gt;Compare v2.0.0-beta.66 → v2.0.0-beta.70&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.66 - Local Emulation &amp; Gradual Deployments</title><link>https://alchemy.run/blog/2026-07-30-beta-66/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-30-beta-66/</guid><description>v2.0.0-beta.66 emulates KV, R2, D1, and Queues locally in alchemy dev with Alchemy.remote() opt-outs, ships Worker versions with gradual deployments and sticky sessions, redesigns Worker URLs around workersDev and a domain object, and adds OpenTelemetry export, a Prisma provider, and a Bedrock LanguageModel binding.</description><pubDate>Thu, 30 Jul 2026 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.66 makes &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; fully local by default: KV, R2, D1, and
Queues are emulated on your machine, and &lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt; opts any
resource back onto the real cloud. Workers gain versions, gradual
deployments, and sticky sessions. The release also redesigns how
Worker URLs and domains are modeled, and adds OpenTelemetry export,
a Prisma provider, and a Bedrock &lt;code dir=&quot;auto&quot;&gt;LanguageModel&lt;/code&gt; binding.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking change&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Worker URL configuration is redesigned
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/977&quot;&gt;#977&lt;/a&gt;). The
&lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;subdomain&lt;/code&gt; props are replaced by &lt;code dir=&quot;auto&quot;&gt;workersDev&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;
takes an object form, and the &lt;code dir=&quot;auto&quot;&gt;domains&lt;/code&gt; output is replaced by
&lt;code dir=&quot;auto&quot;&gt;urls&lt;/code&gt; + &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;. This applies to &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.*&lt;/code&gt;.&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;subdomain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { previewsEnabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;www.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;workersDev&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; previewsEnabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aliases&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;www.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.domains&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// string[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// &quot;https://example.com&quot; — always urls[0]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.urls&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// every URL serving the Worker, most significant first&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt;.domain&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// { name, aliases, redirects } | undefined&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;url: true&lt;/code&gt; (the default) becomes &lt;code dir=&quot;auto&quot;&gt;workersDev: true&lt;/code&gt; — omit it.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;domain: &quot;example.com&quot;&lt;/code&gt; still works as a string.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;domain: []&lt;/code&gt; (explicit detach-all) becomes &lt;code dir=&quot;auto&quot;&gt;domain: null&lt;/code&gt;; an
omitted &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; leaves attachments unmanaged.&lt;/li&gt;
&lt;li&gt;Persisted state migrates automatically on the first redeploy.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;See &lt;a href=&quot;#worker-urls-redesigned&quot;&gt;Worker URLs redesigned&lt;/a&gt; below for the
new model.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;local-emulation-in-alchemy-dev&quot;&gt;Local emulation in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Provider mode (local vs live) is now a first-class engine concept
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/963&quot;&gt;#963&lt;/a&gt;). KV
Namespaces, R2 Buckets, D1 Databases, and Queues are emulated
locally during &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; — they fabricate &lt;code dir=&quot;auto&quot;&gt;dev:&lt;/code&gt;-prefixed ids
with no cloud calls, and Worker bindings lower onto local workerd
simulators. D1 applies &lt;code dir=&quot;auto&quot;&gt;migrationsDir&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;importFiles&lt;/code&gt; against
the local database.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt; opts a resource (or a whole scope) back onto the
real cloud during dev:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// emulated locally in dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;DB&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// real queue, even in dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Jobs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Remote queues work in both directions: a local Worker can produce
to a live queue, and a local &lt;code dir=&quot;auto&quot;&gt;queue()&lt;/code&gt; handler drains a live queue
through an &lt;code dir=&quot;auto&quot;&gt;http_pull&lt;/code&gt; consumer.&lt;/p&gt;
&lt;p&gt;The State Store now records whether each resource is local or
live. Switching between the two plans a replacement: &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; right after &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; replaces local instances with
real cloud resources instead of updating over them. Node-side
capability clients (e.g. in Actions) reach the same local
simulators the Workers see, so a seed script writes to the same
local KV your Worker reads.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;worker-versions--gradual-deployments&quot;&gt;Worker versions &amp;#x26; gradual deployments&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt; prop maps Cloudflare’s &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/versions-and-deployments/&quot;&gt;versions &amp;#x26; gradual
deployments&lt;/a&gt;
onto alchemy stages
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/948&quot;&gt;#948&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Upload one stage’s code as a zero-traffic version of another
stage’s Worker — the PR-preview workflow:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { stage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;staging&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { parent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; message&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`PR #${&lt;/span&gt;&lt;span&gt;process&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PR_NUMBER&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The version’s &lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt; is a stable aliased preview URL that re-points
at each newly uploaded version. Add &lt;code dir=&quot;auto&quot;&gt;traffic&lt;/code&gt; to canary a share of
the parent’s traffic, or roll out a Worker’s own deploy gradually:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { parent&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; traffic&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt; }  &lt;/span&gt;&lt;span&gt;// canary: 10% of staging&apos;s traffic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { traffic&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;span&gt; }          &lt;/span&gt;&lt;span&gt;// self-rollout: new version at 25%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;version.affinity&lt;/code&gt; pins each user to one version for the duration
of a rollout
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/985&quot;&gt;#985&lt;/a&gt;),
requested by &lt;a href=&quot;https://github.com/ericclemmons&quot;&gt;Eric Clemmons&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;traffic&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// sticky by session cookie, falling back to sticky IP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;affinity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { cookie&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;session_id&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; ip&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/gradual-deployments&quot;&gt;Gradual deployments&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;worker-urls-redesigned&quot;&gt;Worker URLs redesigned&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;workersDev&lt;/code&gt; controls the &lt;code dir=&quot;auto&quot;&gt;workers.dev&lt;/code&gt; surface (and is actually
reconciled — the old &lt;code dir=&quot;auto&quot;&gt;subdomain&lt;/code&gt; prop was silently ignored), and
&lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt; grows aliases and redirects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/977&quot;&gt;#977&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;workersDev&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aliases&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;www.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// also serve the Worker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirects&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;old.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;// 301 → https://example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each redirect hostname gets managed DNS and an edge certificate,
plus a zone redirect rule that 301s (path and query preserved)
before Workers run — redirected requests never invoke the Worker.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;urls&lt;/code&gt; lists every URL that serves the Worker, most significant
first, and &lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt; is always &lt;code dir=&quot;auto&quot;&gt;urls[0]&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// workers.dev only (the default)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;https://api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// custom domain — outranks workers.dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// domain with aliases, workersDev: false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://www.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// version worker (version.parent) — the stable aliased preview&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// URL first, then this upload&apos;s per-version URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://pr-42-api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://a1b2c3d4-api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// gradual rollout (version: { traffic }) — the uploaded version&apos;s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// preview URL trails&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://a1b2c3d4-api.my-team.workers.dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// alchemy dev — the dev server&apos;s actual surface&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;http://localhost:5173&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http://192.168.1.23:5173&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Redirect hostnames never appear in &lt;code dir=&quot;auto&quot;&gt;urls&lt;/code&gt; — they serve no content.
That makes &lt;code dir=&quot;auto&quot;&gt;urls&lt;/code&gt; the CORS allow-list:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Vite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// allow the site — on every URL that serves it — to call the API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;ALLOWED_ORIGINS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;.urls }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;In production that allow-list is the site’s custom domain, aliases,
and &lt;code dir=&quot;auto&quot;&gt;workers.dev&lt;/code&gt; URL. Under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; it is the Vite dev
server’s Local and Network URLs — &lt;code dir=&quot;auto&quot;&gt;localhost&lt;/code&gt; plus the LAN address
(&lt;code dir=&quot;auto&quot;&gt;http://192.168…&lt;/code&gt;) — so a phone on your Wi-Fi can load the site
and call the API.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/networking/custom-domains&quot;&gt;Custom domains&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;opentelemetry-export&quot;&gt;OpenTelemetry export&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Deployed apps export traces, logs, and metrics over OTLP from every
runtime — Worker, Durable Object, Workflow, Lambda, Containers, ECS
Task (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/860&quot;&gt;#860&lt;/a&gt;).
Telemetry is a Layer, composed into the Function/Worker’s
&lt;code dir=&quot;auto&quot;&gt;Effect.provide&lt;/code&gt; like any other binding:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;mergeAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketBinding&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Axiom&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Telemetry&lt;/span&gt;&lt;span&gt;({ token&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Ingest&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; traces&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Traces&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Logs&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Telemetry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layerOtlp&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://api.honeycomb.io&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;x-honeycomb-team&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; apiKey }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Axiom.Telemetry&lt;/code&gt; is sugar over the generic
&lt;code dir=&quot;auto&quot;&gt;Alchemy.Telemetry.layerOtlp&lt;/code&gt;, which speaks to any OTLP backend.
Exporters compose: merge several and every destination receives the
telemetry with agreeing trace ids. Without a telemetry layer,
Effect’s no-op tracer keeps instrumentation free.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/telemetry&quot;&gt;Telemetry&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;prisma-provider&quot;&gt;Prisma provider&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Prisma&lt;/code&gt; provisions Prisma Postgres and Prisma Compute
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/416&quot;&gt;#416&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Project&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Project&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { createDatabase&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Postgres&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { project })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Connection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Connection&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; postgres&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Compute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;App&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./app&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bun run build&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; outdir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;.output&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;DATABASE_URL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;.databaseUrl }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Prisma.Compute&lt;/code&gt; is also an effectful runtime, like a Cloudflare
Worker or a Lambda: pass &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; and an Effect body, and the app is
bundled from your Stack file with the &lt;code dir=&quot;auto&quot;&gt;Connect&lt;/code&gt; binding wiring the
database in:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Compute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;project&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Connect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Postgres&lt;/span&gt;&lt;span&gt;({ url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.databaseUrl })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT * FROM users`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Prisma&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Resources reconcile from observed API state, recover from
interrupted deployments, and never persist Prisma credentials as
plaintext.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/prisma&quot;&gt;Prisma&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bedrock-languagemodel&quot;&gt;Bedrock LanguageModel&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Bedrock.LanguageModel&lt;/code&gt; turns any Bedrock model into an
&lt;code dir=&quot;auto&quot;&gt;effect/unstable/ai&lt;/code&gt; &lt;code dir=&quot;auto&quot;&gt;LanguageModel&lt;/code&gt; Layer
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/919&quot;&gt;#919&lt;/a&gt;), so
&lt;code dir=&quot;auto&quot;&gt;generateText&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;streamText&lt;/code&gt;, toolkits, and &lt;code dir=&quot;auto&quot;&gt;Chat&lt;/code&gt; run against
Bedrock unchanged:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bedrock&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LanguageModel&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;us.anthropic.claude-sonnet-4-20250514-v1:0&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LanguageModel&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;generateText&lt;/span&gt;&lt;span&gt;({ prompt })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.text })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(model))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The binding is the IAM boundary: which models the Function may call
is fixed at deploy time. Model choice and inference parameters are
per-call decisions via &lt;code dir=&quot;auto&quot;&gt;AWS.Bedrock.withModelParameters&lt;/code&gt;. The
adapter speaks Bedrock’s Converse API directly.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/ai/bedrock&quot;&gt;Bedrock&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assets-only Workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/969&quot;&gt;#969&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/970&quot;&gt;#970&lt;/a&gt;) — a
Worker with only an &lt;code dir=&quot;auto&quot;&gt;assets&lt;/code&gt; directory deploys with no script at
all, so static requests are free and never invoke a Worker. The
class form works without an impl.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headless OAuth login&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/962&quot;&gt;#962&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; now works over SSH and in containers via a hosted
relay page: paste the code when the browser can’t reach the CLI.
Thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;BlankParticle&lt;/a&gt; (who
also fixed prompt cancellation in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/968&quot;&gt;#968&lt;/a&gt;)!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda Layers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/971&quot;&gt;#971&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.LayerVersion&lt;/code&gt; plus a &lt;code dir=&quot;auto&quot;&gt;layers&lt;/code&gt; prop on &lt;code dir=&quot;auto&quot;&gt;Function&lt;/code&gt;.
Thanks &lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Arya Saatvik&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SES email receiving&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/939&quot;&gt;#939&lt;/a&gt;) —
receipt rule sets, rules, IP filters, and a &lt;code dir=&quot;auto&quot;&gt;SendBounce&lt;/code&gt; binding;
guide at &lt;a href=&quot;https://alchemy.run/aws/email/receiving&quot;&gt;/aws/email/receiving&lt;/a&gt;. Thanks
again &lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Arya Saatvik&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Swarm&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/972&quot;&gt;#972&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Docker.Swarm&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Docker.Context&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;Docker.Service&lt;/code&gt;, including
effectful services bundled and deployed from an Effect impl.
Thanks &lt;a href=&quot;https://github.com/sbekrin&quot;&gt;Sergey Bekrin&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container-backed Durable Objects on async Workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/956&quot;&gt;#956&lt;/a&gt;) — host
npm-packaged container DO classes like &lt;code dir=&quot;auto&quot;&gt;@cloudflare/sandbox&lt;/code&gt;’s
&lt;code dir=&quot;auto&quot;&gt;Sandbox&lt;/code&gt; via &lt;code dir=&quot;auto&quot;&gt;DurableObject(&quot;Sandbox&quot;, { container })&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Worker.URL&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/964&quot;&gt;#964&lt;/a&gt;) — bind
a Worker’s own public URL onto itself; resolves to the local dev
URL under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destroy aggregates failures&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/973&quot;&gt;#973&lt;/a&gt;) — a
failing delete no longer aborts the destroy. Every delete is
attempted and one typed &lt;code dir=&quot;auto&quot;&gt;DestroyError&lt;/code&gt; reports what failed and
what was blocked by it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev Worker handoff is make-before-break&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/863&quot;&gt;#863&lt;/a&gt;) — the
previous workerd instance keeps serving until its replacement
starts, closing the 503 window on slow restarts (e.g. container
image prep).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Output&lt;/code&gt; env secrets upload encrypted&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/943&quot;&gt;#943&lt;/a&gt;) — an
&lt;code dir=&quot;auto&quot;&gt;Output&amp;#x3C;Redacted&gt;&lt;/code&gt; in a Worker’s &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; now uploads as
&lt;code dir=&quot;auto&quot;&gt;secret_text&lt;/code&gt; instead of readable text, and &lt;code dir=&quot;auto&quot;&gt;InferEnv&lt;/code&gt; types are
preserved. Thanks &lt;a href=&quot;https://github.com/sethcarlton&quot;&gt;Seth Carlton&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth credentials refresh on expiry&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/966&quot;&gt;#966&lt;/a&gt;) — a dev
session that outlives the access token re-resolves credentials
instead of failing until restart (the “dev breaks after machine
sleep” hang).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker read fan-out cut&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/932&quot;&gt;#932&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/944&quot;&gt;#944&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/975&quot;&gt;#975&lt;/a&gt;) —
subdomain lookups are memoized, route discovery is scoped to
known zones, and unmanaged custom domains converge to a &lt;code dir=&quot;auto&quot;&gt;noop&lt;/code&gt;
plan — fixing 429 rate-limit errors on accounts with many zones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plain Workers default to &lt;code dir=&quot;auto&quot;&gt;nodejs_compat&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/796&quot;&gt;#796&lt;/a&gt;) — the
default previously reached only Effect-native Workers. The same
PR resolves &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;Output&lt;/code&gt; env values in &lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ECS&lt;/strong&gt; — service reconciliation waits for rollout, drain, and
healthy ALB targets
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/945&quot;&gt;#945&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/samnan-kradle&quot;&gt;samnan-kradle&lt;/a&gt;!),
&lt;code dir=&quot;auto&quot;&gt;taskRoleManagedPolicyArns&lt;/code&gt; attach on the &lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt; form
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/936&quot;&gt;#936&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/bweis&quot;&gt;bweis&lt;/a&gt;!), and &lt;code dir=&quot;auto&quot;&gt;environmentFiles&lt;/code&gt; joins
the shared task-definition surface
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/904&quot;&gt;#904&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;send_email&lt;/code&gt; stubs locally in dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/865&quot;&gt;#865&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;send()&lt;/code&gt; logs to the dev console instead of delivering mail; pipe
the binding through &lt;code dir=&quot;auto&quot;&gt;Alchemy.remote()&lt;/code&gt; to send for real.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destroy removes the persisted stack output&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/965&quot;&gt;#965&lt;/a&gt;) —
cross-stack refs to a destroyed stage now fail with the typed
&lt;code dir=&quot;auto&quot;&gt;InvalidReferenceError&lt;/code&gt; instead of reading an empty husk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlanetScale metadata-only updates no longer replace roles&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/957&quot;&gt;#957&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudFront updates merge observed config&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/935&quot;&gt;#935&lt;/a&gt;) — ends
&lt;code dir=&quot;auto&quot;&gt;IllegalUpdate&lt;/code&gt; failures on members the props don’t express.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt; — the version-update warning prints before interactive
prompts (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/959&quot;&gt;#959&lt;/a&gt;),
and rolldown’s native binding loads lazily so non-Cloudflare
stacks deploy without it
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/955&quot;&gt;#955&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local dev fixes&lt;/strong&gt; — a Worker consuming a queue with a
dead-letter queue starts again
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1000&quot;&gt;#1000&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt; env bindings no longer break Vite builds
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/999&quot;&gt;#999&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/local-development&quot;&gt;Local development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/gradual-deployments&quot;&gt;Gradual deployments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/networking/custom-domains&quot;&gt;Custom domains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/telemetry&quot;&gt;Telemetry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/prisma&quot;&gt;Prisma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/ai/bedrock&quot;&gt;Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta66&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.65...v2.0.0-beta.66&quot;&gt;Compare v2.0.0-beta.65 → v2.0.0-beta.66&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.65 - SageMaker HyperPod</title><link>https://alchemy.run/blog/2026-07-27-beta-65/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-27-beta-65/</guid><description>v2.0.0-beta.65 provisions SageMaker HyperPod clusters — Slurm or EKS orchestrated — with task governance and typed workloads. Plus Worker bundling fixes for Hono-style routes and Drizzle schemas, one-pass destroys for VPC-attached Lambdas, and a smarter nuke.</description><pubDate>Mon, 27 Jul 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.65 brings &lt;strong&gt;SageMaker HyperPod&lt;/strong&gt; to the AWS provider:
persistent ML training fleets, Slurm or EKS orchestrated, with
task governance and typed workloads. It also fixes two Worker
bundling bugs that broke deployed apps, and makes &lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;nuke&lt;/code&gt; converge in one pass.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking change&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;alchemy/SQL&lt;/code&gt; barrel is removed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/951&quot;&gt;#951&lt;/a&gt;). It
eagerly loaded every backend, so projects without the optional
&lt;code dir=&quot;auto&quot;&gt;@effect/sql-pg&lt;/code&gt; peer crashed on import. Import each client from
its own subpath instead:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import * as SQL from &quot;alchemy/SQL&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import * as SQL from &quot;alchemy/SQL/D1&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import * as SQL from &quot;alchemy/SQL/Postgres&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;sagemaker-hyperpod&quot;&gt;SageMaker HyperPod&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;HyperPod is AWS’s persistent fleet for ML training and inference:
accelerated instances with automatic health checks and
faulty-node replacement, staying up between jobs. Where ECS and
EKS run application containers, HyperPod runs distributed
training (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/924&quot;&gt;#924&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/providers/aws/sagemaker/cluster&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.SageMaker.Cluster&lt;/code&gt;&lt;/a&gt;
provisions the fleet. The default orchestrator is Slurm — an S3
lifecycle script, an execution role, and instance groups:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SageMaker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Cluster&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;TrainingCluster&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instanceGroups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;controller&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;InstanceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ml.t3.medium&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;InstanceCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ExecutionRole&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;.roleArn&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;LifeCycleConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SourceS3Uri&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;.sourceS3Uri&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OnCreate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;.onCreate&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Instance groups reconcile in place: change a count or add a group
and the cluster updates; remove one and it is deleted from the
cluster. Jobs are submitted with &lt;code dir=&quot;auto&quot;&gt;sbatch&lt;/code&gt; over SSM — every node
is an SSM target.&lt;/p&gt;
&lt;p&gt;Pass &lt;code dir=&quot;auto&quot;&gt;orchestrator: { Eks }&lt;/code&gt; and the fleet’s nodes join an EKS
cluster you provide. From there, workloads are ordinary
Kubernetes objects — and
&lt;a href=&quot;https://alchemy.run/providers/kubernetes/job&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.EKS.Job&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&quot;https://alchemy.run/providers/kubernetes/deployment&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Deployment&lt;/code&gt;&lt;/a&gt; opt onto HyperPod
nodes with the &lt;code dir=&quot;auto&quot;&gt;hyperpod&lt;/code&gt; prop. The instance-group keys carry
through the cluster’s attributes as types, so a typo’d group name
is a compile error:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;train&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Train&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; eks&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;hyperpod&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { instanceGroup&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hyperpod&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;instanceGroups&lt;/span&gt;&lt;span&gt;.workers }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// training logic; bindings land IAM on pod identity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Task governance arbitrates the fleet between teams:
&lt;a href=&quot;https://alchemy.run/providers/aws/sagemaker/clusterschedulerconfig&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ClusterSchedulerConfig&lt;/code&gt;&lt;/a&gt;
sets priority classes and
&lt;a href=&quot;https://alchemy.run/providers/aws/sagemaker/computequota&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ComputeQuota&lt;/code&gt;&lt;/a&gt; reserves
per-team capacity (Kueue under the hood). A workload submits
through governance by passing the quota resource:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;hyperpod&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instanceGroup&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hyperpod&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;instanceGroups&lt;/span&gt;&lt;span&gt;.workers&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;quota&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;                     &lt;/span&gt;&lt;span&gt;// → hyperpod-ns-research + queue label&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;priorityClass&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;training&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/compute/hyperpod&quot;&gt;HyperPod&lt;/a&gt;. The full working stack
(both orchestrators, governance, every workload tier) is
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/tree/main/examples/aws-hyperpod&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;examples/aws-hyperpod&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;worker-bundling-fixes&quot;&gt;Worker bundling fixes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Two bundling bugs could break a deployed Worker even though the
deploy succeeded. Both are fixed.&lt;/p&gt;
&lt;p&gt;Hono/Express-style route registrations were stripped from the
bundle (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/952&quot;&gt;#952&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;purePlugin&lt;/code&gt; annotated top-level calls like &lt;code dir=&quot;auto&quot;&gt;app.get(&quot;/&quot;, handler)&lt;/code&gt; as pure, and under minification that annotation is a
deletion instruction — so every request 404’d. Statement-position
calls are now only annotated in packages that explicitly declare
&lt;code dir=&quot;auto&quot;&gt;sideEffects: false&lt;/code&gt;, and never in entry modules.&lt;/p&gt;
&lt;p&gt;Cross-chunk evaluation order is now correct
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/940&quot;&gt;#940&lt;/a&gt;).
Rolldown could split top-level initializers (e.g. Drizzle
&lt;code dir=&quot;auto&quot;&gt;pgTable&lt;/code&gt; schemas) into a chunk that ran before its dependencies,
failing Cloudflare startup validation with &lt;code dir=&quot;auto&quot;&gt;Cannot access &apos;a&apos; before initialization&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;strictExecutionOrder&lt;/code&gt; is now on by
default, preserving ESM semantics across chunk boundaries.&lt;/p&gt;
&lt;p&gt;The same PR opens up per-Worker control of chunking: &lt;code dir=&quot;auto&quot;&gt;build&lt;/code&gt;
forwards rolldown output options and &lt;code dir=&quot;auto&quot;&gt;preserveEntrySignatures&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;codeSplitting&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;groups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;auth&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; test&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;packages/(schema|auth)/&quot;&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;destroy-and-nuke-converge-in-one-pass&quot;&gt;Destroy and nuke converge in one pass&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Destroying a stack with a VPC-attached Lambda used to strand
subnets and security groups on &lt;code dir=&quot;auto&quot;&gt;DependencyViolation&lt;/code&gt;, forcing
repeated &lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt; runs
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/937&quot;&gt;#937&lt;/a&gt;). The
cause: Lambda’s Hyperplane ENIs linger in the VPC for many
minutes after the function is deleted, and AWS’s own reaper can
take 20+ minutes to clear them. Subnet and security-group deletes
now identify detached Lambda ENIs and delete them directly, so
one &lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt; removes everything.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy unsafe nuke&lt;/code&gt; gets the same treatment
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/950&quot;&gt;#950&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;--independent&lt;/code&gt; retries each delete on its own capped backoff
instead of a shared barrier, so one hanging delete only ever
stalls itself.&lt;/li&gt;
&lt;li&gt;Providers declare which resource types their cloud-side
teardown consumes (a HyperPod cluster deletes its ENIs by
assuming its IAM role inside its VPC), and nuke deletes in
topologically-ordered waves so a role is never deleted out from
under an in-flight cluster teardown.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;_redirects&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;_headers&lt;/code&gt; now reach Cloudflare&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/928&quot;&gt;#928&lt;/a&gt;) —
the files were read and hashed but never sent, so redirect and
header rules were silently dropped. They now apply in deploys,
no-op redeploys, and &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflows under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;&lt;/strong&gt;: pausing a workflow no longer
reports &lt;code dir=&quot;auto&quot;&gt;errored&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/934&quot;&gt;#934&lt;/a&gt;), and
workflow classes export correctly in vite dev
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/933&quot;&gt;#933&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Docker.Container&lt;/code&gt; supports &lt;code dir=&quot;auto&quot;&gt;labels&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;stopTimeout&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/931&quot;&gt;#931&lt;/a&gt;) —
enabling Traefik-managed routing in a remote Docker context.
Thanks &lt;a href=&quot;https://github.com/Gerbuuun&quot;&gt;Gerbuuun&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Test/Vitest&lt;/code&gt; is restored&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/947&quot;&gt;#947&lt;/a&gt;) —
the internal move to alchemy-test accidentally removed the
public vitest harness that shipped through beta.63.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branded primitives stay opaque in Outputs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/941&quot;&gt;#941&lt;/a&gt;) — a
&lt;code dir=&quot;auto&quot;&gt;string &amp;#x26; Brand&amp;#x3C;&quot;UserId&quot;&gt;&lt;/code&gt; Action output is now &lt;code dir=&quot;auto&quot;&gt;Output&amp;#x3C;UserId&gt;&lt;/code&gt;
instead of exploding into an &lt;code dir=&quot;auto&quot;&gt;ObjectExpr&lt;/code&gt; over every string
method.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL fragment helpers compose on wrapped clients&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/951&quot;&gt;#951&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;sql`INSERT INTO users ${sql.insert(row)}`&lt;/code&gt; and nested
&lt;code dir=&quot;auto&quot;&gt;sql.and&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;sql.or&lt;/code&gt; now replay against the resolved client, with
new live test suites covering the full &lt;code dir=&quot;auto&quot;&gt;SqlClient&lt;/code&gt; surface on
D1 and Postgres.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The alchemy-test plain reporter&lt;/strong&gt; prints a &lt;code dir=&quot;auto&quot;&gt;[done/total]&lt;/code&gt;
progress counter per test and a failed-test list at the end of
the run.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/hyperpod&quot;&gt;HyperPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/eks&quot;&gt;EKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/choosing-a-runtime&quot;&gt;Choosing a runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta65&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.64...v2.0.0-beta.65&quot;&gt;Compare v2.0.0-beta.64 → v2.0.0-beta.65&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>A Test Runner for Agents</title><link>https://alchemy.run/blog/2026-07-22-a-test-runner-for-agents/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-22-a-test-runner-for-agents/</guid><description>Alchemy&apos;s test suite is 4,000+ live tests against real clouds, and some take minutes. Vitest forked processes and reloaded our generated SDK on every fork; bun test assumes tests are fast and runs them one file at a time. So we wrote our own runner — one bun process, everything concurrent, plain output tuned for agents and a live TUI for humans.</description><pubDate>Wed, 22 Jul 2026 07:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alchemy’s test suite is not a normal test suite. It’s &lt;strong&gt;4,000+
live tests&lt;/strong&gt; that deploy real resources to real clouds and tear
them down again. Some finish in milliseconds. Some take minutes —
provisioning an EKS cluster, waiting for an eventually consistent
API to converge, pushing a message through a queue and polling
until it comes out the other side.&lt;/p&gt;
&lt;p&gt;That shape broke every runner we tried. So we built our own:
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/tree/main/packages/alchemy-test&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy-test&lt;/code&gt;&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/848&quot;&gt;#848&lt;/a&gt;), a
vitest-compatible runner built for our scale: the entire suite
runs in a single bun process, plain output is designed for the
agent reading it, and an interactive TUI gives humans a live view
of a run with thousands of tests in flight.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-not-vitest&quot;&gt;Why not vitest&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Vitest parallelizes across workers, and every worker builds its
own module graph — threads don’t share modules any more than
forks do. Everything alchemy depends on includes
&lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled&lt;/a&gt;, our
generated AWS/Cloudflare SDK, which spans hundreds of service
modules. Paying that import cost once is fine. Paying it per
worker, hundreds of times per run, is not.&lt;/p&gt;
&lt;p&gt;There’s no way out of that trade-off inside vitest. It can run
everything in one worker (&lt;code dir=&quot;auto&quot;&gt;singleFork&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;isolate: false&lt;/code&gt;) —
but &lt;a href=&quot;https://vitest.dev/config/#pooloptions-forks-singlefork&quot;&gt;by vitest’s own
docs&lt;/a&gt;
that “will force tests to run one after another”, and source code
processed by vite “will still be reevaluated for each test” even
then. Parallel files mean many workers; one worker means a
sequential suite. The quadrant we needed — many files in flight,
one module graph — doesn’t exist.&lt;/p&gt;
&lt;p&gt;For us it was worse than that. Our toolchain runs on bun, and
bun’s &lt;code dir=&quot;auto&quot;&gt;worker_threads&lt;/code&gt; segfaults under vitest’s tinypool at
worker spawn — so we were pinned to &lt;code dir=&quot;auto&quot;&gt;pool: &quot;forks&quot;&lt;/code&gt;, full
&lt;code dir=&quot;auto&quot;&gt;child_process&lt;/code&gt; forks, the most expensive flavor of an already
expensive design. And no, “just run tests on node” doesn’t fix
it: the per-worker import cost is the same, and node can’t
execute distilled’s TypeScript natively, so a transform layer
comes back.&lt;/p&gt;
&lt;p&gt;The module cost also made iteration slow in a way that hurt
agents most. To load distilled’s TypeScript source in vitest we
needed a rolldown plugin; the alternative was compiling
distilled’s &lt;code dir=&quot;auto&quot;&gt;.ts&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;.js&lt;/code&gt; before every run. Either way there was
a build step between “agent edits code” and “agent sees the test
result”. Agents iterate on failing tests in tight loops — every
second of compile tax is paid dozens of times per task.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-not-bun-test&quot;&gt;Why not bun test&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;bun test&lt;/code&gt; solves both problems: it’s bun-native, so &lt;code dir=&quot;auto&quot;&gt;.ts&lt;/code&gt; loads
directly with no plugin and no compile step. But it runs test
files one at a time, an assumption that only works when tests are
fast.&lt;/p&gt;
&lt;p&gt;Alchemy tests are slow on purpose — they wait for real clouds. Run
them sequentially and a directory that should take two minutes
takes an hour. We needed dozens of files in flight at once, in one
process, on bun.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-process-everything-concurrent&quot;&gt;One process, everything concurrent&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy-test&lt;/code&gt; imports every test file up front (imports are cheap
when they happen once) and then runs files and tests concurrently
on the Effect runtime — fibers, not forks. A &lt;code dir=&quot;auto&quot;&gt;--concurrency&lt;/code&gt; flag
bounds how many files run at once, and tests that mutate global
state can take a whole-process lock with &lt;code dir=&quot;auto&quot;&gt;{ exclusive: true }&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The CLI is vitest-compatible — positional paths, &lt;code dir=&quot;auto&quot;&gt;-t&lt;/code&gt; filters,
timeouts, retries — so the migration was a codemod.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test/Cloudflare/Workers&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cron&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;output-an-agent-can-act-on&quot;&gt;Output an agent can act on&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Performance forced our hand, but once we owned the runner we
could fix something that had bothered us just as long: the
output.&lt;/p&gt;
&lt;p&gt;Vitest’s default reporter prints stdout noisily: interleaved
across parallel tests, indented and reflowed on top of your raw
output. When a test fails, the error is somewhere in the scroll.
We watched agents run a suite, &lt;code dir=&quot;auto&quot;&gt;tail&lt;/code&gt; the output to save context,
and lose the one error they needed — even when prompted not to.
A custom reporter can quiet some of this, but it works by
intercepting &lt;code dir=&quot;auto&quot;&gt;console&lt;/code&gt; and guessing which test a log belongs to —
best-effort attribution you’re consuming, not controlling.&lt;/p&gt;
&lt;p&gt;Our tests are Effects, which means we control the runtime they
execute in. Each test runs under a buffering &lt;code dir=&quot;auto&quot;&gt;Logger&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;Console&lt;/code&gt;, so every log line is captured and attributed to its
test by construction — nothing interleaves, nothing prints as it
happens. The console gets exactly one line per test:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✓ test/Cloudflare/Workers/Subdomain.test.ts &gt; enable and disable the workers.dev subdomain (3.2s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✓ test/Cloudflare/Workers/Rpc.test.ts &gt; detects valid envelope (1ms)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✗ test/Cloudflare/Workers/Route.test.ts &gt; replaces the route when the zone changes (12.4s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AssertionError: expected &quot;alchemy-test-2.us/api/*&quot; to be &quot;alchemy-test-2.us/v2/*&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;at test/Cloudflare/Workers/Route.test.ts:87:22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--- captured output ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Plan: 1 to replace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[route] deleting&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[route] created&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--- end output ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;✓ test/Cloudflare/Workers/Workflow.test.ts &gt; runs a workflow to completion (51.9s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A failing test prints its error and its captured output inline,
immediately, while the run continues. Passing tests stay silent —
their output would be noise.&lt;/p&gt;
&lt;p&gt;If nothing finishes for ten seconds, the runner prints what’s
still running, so a hang is diagnosable from the console instead
of a mystery:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;⧗ [16:38:12] no tests finished in the last 10s — 2 still running:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test/Cloudflare/Workers/Workflow.test.ts &gt; runs a workflow to completion (48.1s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;test/Cloudflare/Workers/CronEventSource.test.ts &gt; cron handler fires (32.7s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;And the run ends by telling the agent exactly how to go deeper:
the summary, the failures repeated in one place, and a per-run
log file — with its size, so the agent knows whether to read it
or search it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Tests: 1 failed | 171 passed | 1 skipped (31 files, 89.3s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Full log: .alchemy/log/test/2026-07-16T23-42-38-pid92186.log (1055 lines, 118 KB)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The log file has everything the console suppressed: every test’s
captured output, passes included, written color-free as the run
progresses. Each run gets its own timestamped file, so concurrent
runs in different terminals never trample each other. The console
is the summary; the log is the record. The agent reads the one
line it needs and greps the file when it needs more.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;humans-get-a-tui&quot;&gt;Humans get a TUI&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;For interactive use, &lt;code dir=&quot;auto&quot;&gt;--tui&lt;/code&gt; opens a k9s-style live view: a
collapsible file/test tree, type-to-filter, and retry/kill on
running tests:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alchemy-test  ✓ 159  ✗ 0  ◐ 7  · 5  │ 53.4s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▸ ✓ test/Cloudflare/Workers/AccountSetting.test.ts  3/3 passed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▾ ◐ test/Cloudflare/Workers/DurableObjectNamespace.test.ts  2 running · 11/13 passed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✓ getByName round-trips state (1.9s)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;◐ websocket hibernation survives eviction (12.3s…)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▸ ◐ test/Cloudflare/Workers/HttpApi.test.ts  5/5 passed  — afterAll running (18.6s)…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▸ · test/Cloudflare/Workers/WaitUntil.test.ts  0/2 passed  — waiting for a worker slot…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▸ ✓ test/Cloudflare/Workers/Worker.test.ts  17/17 passed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Pressing &lt;code dir=&quot;auto&quot;&gt;enter&lt;/code&gt; on a running test live-tails its captured
output — useful when a deploy is three minutes into &lt;code dir=&quot;auto&quot;&gt;beforeAll&lt;/code&gt;
and you want to know what it’s doing.&lt;/p&gt;
&lt;p&gt;The hotkeys are vim-flavored: &lt;code dir=&quot;auto&quot;&gt;j&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;k&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;ctrl-d&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;ctrl-u&lt;/code&gt; to
move, &lt;code dir=&quot;auto&quot;&gt;/&lt;/code&gt; for live type-to-filter, &lt;code dir=&quot;auto&quot;&gt;p&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;f&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;n&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;s&lt;/code&gt; to toggle
passing, failing, pending, and skipped tests in and out of view.
&lt;code dir=&quot;auto&quot;&gt;r&lt;/code&gt; retries the selected test or file, &lt;code dir=&quot;auto&quot;&gt;R&lt;/code&gt; retries everything
that failed, &lt;code dir=&quot;auto&quot;&gt;x&lt;/code&gt; kills a running test, and &lt;code dir=&quot;auto&quot;&gt;y&lt;/code&gt; copies a failure’s
error and captured output to the clipboard — handy for pasting
straight into an agent chat.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;owning-the-runner&quot;&gt;Owning the runner&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The whole thing was easy to build — a test harness, a scheduler,
and two reporters over an event stream, in a codebase that
already runs everything on Effect. That’s the part worth
underlining: it was cheap to make &lt;em&gt;because&lt;/em&gt; we only target
Effect, and owning it means the feedback loop is ours to tune.
When we notice agents misreading output, we change the output.
No plugin API in between.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/tree/main/packages/alchemy-test&quot;&gt;alchemy-test on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/848&quot;&gt;The PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory&quot;&gt;Looping the Generation of IaC and SDKs&lt;/a&gt; — the agent fleet this runner feeds&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.64 - Full AWS Coverage</title><link>https://alchemy.run/blog/2026-07-22-beta-64/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-22-beta-64/</guid><description>v2.0.0-beta.64 is the AWS release — generated coverage of (nearly) every AWS service, unified container platforms on ECS and EKS, Durable Lambda Functions, and Helm charts on EKS. Plus Python Workers, Drizzle for D1, GitHub Enterprise, and a new Effect-native test runner.</description><pubDate>Wed, 22 Jul 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.64 is the AWS release. Alchemy now covers &lt;strong&gt;206 AWS
services&lt;/strong&gt;, with every resource and binding live-tested against
the real cloud. It also adds first-class &lt;strong&gt;containers on ECS and
EKS&lt;/strong&gt;, &lt;strong&gt;Durable Lambda Functions&lt;/strong&gt;, and &lt;strong&gt;Helm charts&lt;/strong&gt; on EKS.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container props are restructured&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/867&quot;&gt;#867&lt;/a&gt;):
&lt;code dir=&quot;auto&quot;&gt;docker: { base }&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;image&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AWS.EKS.ServerHost&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;AWS.EKS.Deployment&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;alchemy/Kubernetes&lt;/code&gt; is removed in favor
of &lt;code dir=&quot;auto&quot;&gt;AWS.EKS.Manifest&lt;/code&gt;, and one-shot ECS Task impls return
&lt;code dir=&quot;auto&quot;&gt;{ run }&lt;/code&gt; instead of &lt;code dir=&quot;auto&quot;&gt;{ fetch }&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS prop data types are richer&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/797&quot;&gt;#797&lt;/a&gt;):
duration props take &lt;code dir=&quot;auto&quot;&gt;Duration.Input&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;&quot;1 hour&quot;&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Duration.hours(1)&lt;/code&gt;), and sensitive props (passwords, secrets,
keys) are &lt;code dir=&quot;auto&quot;&gt;Redacted.Redacted&amp;#x3C;string&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;100-aws-coverage&quot;&gt;“100%” AWS coverage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One PR (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/797&quot;&gt;#797&lt;/a&gt;)
took the AWS provider from a handful of services to all of them,
using the same &lt;a href=&quot;https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory&quot;&gt;resource
factory&lt;/a&gt; that built
out the Cloudflare provider. Fleets of agents cataloged all 428
generated SDK modules, then implemented and live-tested them in
waves: serverless first, then ECS/Fargate, EKS, EC2, and the long
tail. Everything left over is documented as out of scope
(deprecated APIs, data-only endpoints, billing objects). The
result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;206 AWS services&lt;/strong&gt; with &lt;strong&gt;683 resources&lt;/strong&gt; and &lt;strong&gt;2,842
bindings&lt;/strong&gt; (plus event sources and sinks), from DynamoDB and S3
all the way out to MediaLive, IoT SiteWise, Bedrock, and
SageMaker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2,692 live tests green by default&lt;/strong&gt; against real AWS. 375
more are gated behind env vars because they are slow to
provision, expensive, or need special account entitlements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-orphan guarantee&lt;/strong&gt;: each round wiped the test account
clean, ran the full suite, then audited the account for
leftover resources. The loop ran until two consecutive rounds
left nothing behind. A passing test that leaks a cloud resource
is a provider bug, and the loop caught dozens of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bindings are 1:1 with IAM actions. Each binding your code uses
becomes a least-privilege policy statement on exactly the
resources it touches, whether the code runs on Lambda, ECS, or
EKS:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; desiredCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// init: each binding grants one IAM action on one ARN&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetItem&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SendMessage&lt;/span&gt;&lt;span&gt;(queue)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getItem&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { pk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user#1&quot;&lt;/span&gt;&lt;span&gt; } } })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;MessageBody&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;stringify&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Item&lt;/span&gt;&lt;span&gt;) })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ ok&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetItemHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SendMessageHttp&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You never write an IAM policy, and every error is typed — the
compiler tells you what can fail and you handle it like any other
Effect error. See &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings&lt;/a&gt;
for how it works.&lt;/p&gt;
&lt;p&gt;All of it is documented in the &lt;a href=&quot;https://alchemy.run/providers&quot;&gt;API reference&lt;/a&gt;, with
usage examples on every resource and binding.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ecs-tasks-and-services&quot;&gt;ECS: Tasks and Services&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;ECS gets the full platform treatment
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/867&quot;&gt;#867&lt;/a&gt;):
&lt;a href=&quot;https://alchemy.run/providers/aws/ecs/task&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Task&lt;/code&gt;&lt;/a&gt; for run-to-completion work and
&lt;a href=&quot;https://alchemy.run/providers/aws/ecs/service&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt;&lt;/a&gt; for long-running servers.
Both are authored the same three ways as Workers and Lambda: an
external image, an inline effect, or a tagged class.&lt;/p&gt;
&lt;p&gt;Every container platform takes one image source, flat on props:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ main }                                   &lt;/span&gt;&lt;span&gt;// bundle this Effect program&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; image }                            &lt;/span&gt;&lt;span&gt;// bundle FROM your base image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dockerfile&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; }                   &lt;/span&gt;&lt;span&gt;// build your own Dockerfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ dockerfile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Dockerfile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;inline&lt;/span&gt;&lt;span&gt;`...`&lt;/span&gt;&lt;span&gt; }     &lt;/span&gt;&lt;span&gt;// inline Dockerfile content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{ image }                                  &lt;/span&gt;&lt;span&gt;// registry ref, mirrored into ECR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The simplest &lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt; runs a registry image behind a provisioned
Application Load Balancer:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Cluster&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AppCluster&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Edge&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;public.ecr.aws/nginx/nginx:1.27&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;desiredCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadBalancer&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// http://&amp;#x3C;alb-dns-name&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt; can also run an Effect program. The impl returns
&lt;code dir=&quot;auto&quot;&gt;{ fetch }&lt;/code&gt;, and bindings grant IAM to the task role:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; desiredCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItem&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.json) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; { orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Item&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { pk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;.orderId } } })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ ok&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItemHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A one-shot &lt;code dir=&quot;auto&quot;&gt;Task&lt;/code&gt; is the run-to-completion counterpart: the impl
returns &lt;code dir=&quot;auto&quot;&gt;{ run }&lt;/code&gt;, and the container exits when the effect
completes. Here it composes &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;Dockerfile.inline&lt;/code&gt; — the
inline content builds the environment, and the bundled program is
layered on top:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Dockerfile&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Docker&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;thumbnailer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Task&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Thumbnailer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dockerfile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Dockerfile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;inline&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FROM oven/bun:1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;RUN apt-get update &amp;#x26;&amp;#x26; apt-get install -y ffmpeg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cpu&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;memory&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2048&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getObject&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetObject&lt;/span&gt;&lt;span&gt;(bucket)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// pull the video from S3, shell out to ffmpeg, then exit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetObjectHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Tasks are launched from other compute with the
&lt;a href=&quot;https://alchemy.run/providers/aws/ecs/runtask&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;RunTask&lt;/code&gt;&lt;/a&gt; binding, which grants
&lt;code dir=&quot;auto&quot;&gt;ecs:RunTask&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;iam:PassRole&lt;/code&gt; automatically — here a Lambda
function launches a task per request:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runTask&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RunTask&lt;/span&gt;&lt;span&gt;(cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; thumbnailer)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runTask&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;launchType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;FARGATE&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;networkConfiguration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;awsvpcConfiguration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { subnets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [subnetId] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;taskArn&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.tasks?.[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]?.taskArn&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or run a task on a schedule with &lt;code dir=&quot;auto&quot;&gt;AWS.ECS.every&lt;/code&gt;, which
provisions the EventBridge rule and invoke role:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ECS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;every&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NightlyJob&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cron(0 3 * * ? *)&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; nightlyTask&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;subnets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;privateSubnet&lt;/span&gt;&lt;span&gt;.subnetId]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Services go well past &lt;code dir=&quot;auto&quot;&gt;loadBalancer: true&lt;/code&gt;: multiple services can
share one load balancer, and props cover custom domains,
auto-scaling on CPU or request count, Fargate Spot capacity, EFS
volumes, secrets, and health checks. Docs:
&lt;a href=&quot;https://alchemy.run/aws/compute/ecs&quot;&gt;ECS&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;eks-deployments-jobs-manifests-and-helm&quot;&gt;EKS: Deployments, Jobs, Manifests, and Helm&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kubernetes workloads live in the same TypeScript program as the
cluster itself — no YAML, no &lt;code dir=&quot;auto&quot;&gt;kubectl&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;compute: &quot;auto&quot;&lt;/code&gt; stands
up an EKS Auto Mode cluster where AWS manages the nodes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Network&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Network&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cidrBlock&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10.42.0.0/16&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;availabilityZones&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;single&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Cluster&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cluster&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;auto&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resourcesVpcConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { subnetIds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;.privateSubnetIds }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Deployment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; replicas&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; serviceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;LoadBalancer&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItem&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// → pod-identity IAM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; }) }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItemHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/providers/kubernetes/deployment&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Deployment&lt;/code&gt;&lt;/a&gt; synthesizes a
Kubernetes &lt;code dir=&quot;auto&quot;&gt;Deployment&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;ServiceAccount&lt;/code&gt;, with
bindings landing as pod-identity IAM.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/providers/kubernetes/job&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Job&lt;/code&gt;&lt;/a&gt; is the run-to-completion
counterpart — same image sources, and the impl returns &lt;code dir=&quot;auto&quot;&gt;{ run }&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;seed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;SeedData&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItem&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// runs to completion, then the pod exits&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItemHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Add &lt;code dir=&quot;auto&quot;&gt;schedule&lt;/code&gt; and a Job becomes a Kubernetes CronJob — here in
the external form, running a pre-built image:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nightly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NightlyBackfill&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ghcr.io/acme/backfill:v3&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;0 3 * * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/providers/kubernetes/manifest&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Manifest&lt;/code&gt;&lt;/a&gt; applies any raw
Kubernetes object via server-side apply, CRDs included — the
manifest is a literal object, exactly what you’d write in YAML.
No kubeconfig required:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Manifest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;apps/v1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;StatefulSet&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;cache&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; namespace&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;apps&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { replicas&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/providers/kubernetes/helmchart&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;HelmChart&lt;/code&gt;&lt;/a&gt; installs Helm charts
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/891&quot;&gt;#891&lt;/a&gt;). It
renders the chart locally with &lt;code dir=&quot;auto&quot;&gt;helm template&lt;/code&gt; and applies the
objects to the cluster, so Alchemy owns the lifecycle: drift is
corrected on every deploy, dropped objects are pruned, and
destroy deletes everything:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ingress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EKS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HelmChart&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;IngressNginx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cluster&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chart&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ingress-nginx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://kubernetes.github.io/ingress-nginx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;4.11.2&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ingress-nginx&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;createNamespace&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;values&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { controller&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { replicaCount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; } }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/compute/eks&quot;&gt;EKS&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;durable-lambda-functions&quot;&gt;Durable Lambda Functions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.DurableFunction&lt;/code&gt; writes long-running orchestrations
as plain code, built on AWS Lambda’s durable execution model
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/797&quot;&gt;#797&lt;/a&gt;). It
&lt;strong&gt;is&lt;/strong&gt; a Lambda Function, with the same props and bindings, but
its body is checkpointed. &lt;code dir=&quot;auto&quot;&gt;Durable.step&lt;/code&gt; records each result so
it isn’t re-run on replay. &lt;code dir=&quot;auto&quot;&gt;Durable.sleep&lt;/code&gt; suspends the execution
entirely; Lambda re-invokes the function to resume it. And
&lt;code dir=&quot;auto&quot;&gt;Durable.waitForCallback&lt;/code&gt; pauses on an external signal for up to
a year:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OrderFlow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableFunction&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;OrderFlow&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;OrderFlow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OrderFlow&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; executionTimeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1 hour&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// init: resolve typed binding clients (IAM lands on this role)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItem&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; (input&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string }&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reserved&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Durable&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;step&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;reserve&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;putItem&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;Item&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { pk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;.orderId } } }).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.orDie)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ retry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { limit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; delay&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;5 seconds&quot;&lt;/span&gt;&lt;span&gt; } }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Durable&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;cooldown&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10 minutes&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;.orderId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reserved&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PutItemHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Replay requires the body to be deterministic, and the type system
enforces it: the run body has no access to cloud credentials, so
the only way to do I/O is through a binding client resolved in
init and called inside a &lt;code dir=&quot;auto&quot;&gt;Durable.step&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;yield* OrderFlow&lt;/code&gt; returns a typed handle to start, inspect, and
stop executions, and to complete callbacks from the outside:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;orders&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OrderFlow&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;orders&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;order-123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// idempotent start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;123&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;orders&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt;.executionArn&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// execution.Status: &quot;RUNNING&quot; | &quot;SUCCEEDED&quot; | &quot;FAILED&quot; | ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The vocabulary mirrors Cloudflare
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows&quot;&gt;Workflows&lt;/a&gt;, so orchestration code
reads the same on both clouds. Reference:
&lt;a href=&quot;https://alchemy.run/providers/aws/lambda/durablefunction&quot;&gt;DurableFunction&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-sql-and-drizzle-for-d1&quot;&gt;Effect SQL and Drizzle for D1&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Drizzle now works end to end on Cloudflare D1
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/887&quot;&gt;#887&lt;/a&gt;),
mirroring the Neon and PlanetScale integrations. At deploy time,
&lt;code dir=&quot;auto&quot;&gt;Drizzle.Schema&lt;/code&gt; diffs your schema module and writes pending
migration SQL, and passing &lt;code dir=&quot;auto&quot;&gt;schema.out&lt;/code&gt; as the database’s
&lt;code dir=&quot;auto&quot;&gt;migrationsDir&lt;/code&gt; makes the database apply it — generate first,
apply second, in one deploy:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/db.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app-schema&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/schema.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./migrations&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dialect&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;sqlite&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app-db&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrationsDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schema&lt;/span&gt;&lt;span&gt;.out&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;At runtime, a Worker binds the database with
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.D1.QueryDatabase&lt;/code&gt; and hands the client to
&lt;code dir=&quot;auto&quot;&gt;Drizzle.D1&lt;/code&gt;. Every query is an Effect with &lt;code dir=&quot;auto&quot;&gt;SqlError&lt;/code&gt; in the
typed error channel:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/api.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.url }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;relations&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Users&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;findMany&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { posts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabaseBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The low-level effect-sql clients also get one home: the new
&lt;code dir=&quot;auto&quot;&gt;alchemy/SQL/*&lt;/code&gt; subpaths, with a raw tagged-template client for
each Drizzle integration. It binds inside a Worker the same way:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/SQL/D1&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;d1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabase&lt;/span&gt;&lt;span&gt;(database)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;(d1)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT id, name FROM users`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({ rows })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabaseBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;All clients share the same lifecycle: nothing connects at plan or
deploy time, the client is built lazily on the first query, and
it’s torn down when the request settles. The website’s new
&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL hub&lt;/a&gt; collects effect-sql, Drizzle, and migrations in
one place
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/903&quot;&gt;#903&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python Workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/861&quot;&gt;#861&lt;/a&gt;) —
point &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; at a &lt;code dir=&quot;auto&quot;&gt;.py&lt;/code&gt; file and &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt; deploys a
Python Worker, with dependencies vendored from &lt;code dir=&quot;auto&quot;&gt;pyproject.toml&lt;/code&gt;
via uv. Docs:
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/python-workers&quot;&gt;Python Workers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workers AI binding&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/850&quot;&gt;#850&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workers.AI&lt;/code&gt; runs models on Cloudflare’s GPU fleet
from a Worker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable Objects pin to a region&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/851&quot;&gt;#851&lt;/a&gt;) with
&lt;code dir=&quot;auto&quot;&gt;locationHint&lt;/code&gt;, and DO classes &lt;strong&gt;transfer between workers&lt;/strong&gt;
declaratively
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/803&quot;&gt;#803&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Enterprise + deployment environments&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/845&quot;&gt;#845&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; accepts an enterprise host (GHES and data
residency), and the new &lt;code dir=&quot;auto&quot;&gt;GitHub.Environment&lt;/code&gt; resource manages
deployment environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect-native test runner&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/848&quot;&gt;#848&lt;/a&gt;) —
the whole alchemy test suite now runs in a single bun process
on &lt;code dir=&quot;auto&quot;&gt;alchemy-test&lt;/code&gt;, with output designed for agents. Full story:
&lt;a href=&quot;https://alchemy.run/blog/2026-07-22-a-test-runner-for-agents&quot;&gt;A Test Runner Built for
Agents&lt;/a&gt;. The live
suite converged to green: 4,458 passed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/916&quot;&gt;#916&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDS safety&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;MasterUserPassword&lt;/code&gt; is fingerprint-guarded so
it’s no longer re-sent on every reconcile
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/876&quot;&gt;#876&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;skipFinalSnapshot: false&lt;/code&gt; takes a final snapshot on deliberate
teardown
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/877&quot;&gt;#877&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AWS_REGION&lt;/code&gt; overrides the SSO profile’s stored region&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/895&quot;&gt;#895&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engine reliability&lt;/strong&gt; — destroy aggregates GC failures and
refuses to silently orphan zombie rows
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/899&quot;&gt;#899&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/862&quot;&gt;#862&lt;/a&gt;),
&lt;code dir=&quot;auto&quot;&gt;--force&lt;/code&gt; refreshes stale bound attributes
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/900&quot;&gt;#900&lt;/a&gt;),
binding diffs are stable across runs
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/898&quot;&gt;#898&lt;/a&gt;),
unresolved Outputs are never persisted into state
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/835&quot;&gt;#835&lt;/a&gt;), and
truncated physical names stay unique
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/868&quot;&gt;#868&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions get local bindings and Output accessors&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/807&quot;&gt;#807&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; works without an &lt;code dir=&quot;auto&quot;&gt;alchemy.run.ts&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/842&quot;&gt;#842&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrating from v1&lt;/strong&gt; now adopts existing resources instead of
destroying and recreating them
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/819&quot;&gt;#819&lt;/a&gt;) —
see &lt;a href=&quot;https://alchemy.run/migrating-from-v1&quot;&gt;Migrating from v1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare fixes&lt;/strong&gt;: queue-consumer wiring surviving mid-start
reconciles
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/917&quot;&gt;#917&lt;/a&gt;),
asset-upload retries
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/914&quot;&gt;#914&lt;/a&gt;),
wasm in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/881&quot;&gt;#881&lt;/a&gt;), and
Effect-valued env bindings converging in plans
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/890&quot;&gt;#890&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The website now lives at
&lt;a href=&quot;https://alchemy.run&quot;&gt;alchemy.run&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/806&quot;&gt;#806&lt;/a&gt;),
builds 8x faster on Astro 7
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/873&quot;&gt;#873&lt;/a&gt;), and
the &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/layers&quot;&gt;Layers&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings&lt;/a&gt;, and
&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/runtime&quot;&gt;Runtime&lt;/a&gt;
concept pages are rewritten.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws&quot;&gt;AWS&lt;/a&gt; — the provider hub: setup, tutorial, and guides&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/ecs&quot;&gt;ECS&lt;/a&gt; and &lt;a href=&quot;https://alchemy.run/aws/compute/eks&quot;&gt;EKS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/choosing-a-runtime&quot;&gt;Choosing a runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql&quot;&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta64&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.63...v2.0.0-beta.64&quot;&gt;Compare v2.0.0-beta.63 → v2.0.0-beta.64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.63 - Durable Object Transfers &amp; Action Bindings</title><link>https://alchemy.run/blog/2026-07-17-beta-63/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-17-beta-63/</guid><description>v2.0.0-beta.63 moves Durable Object classes between Workers with their data intact, lets Actions bind resources and read Outputs with your CLI credentials, and makes alchemy login work from any folder. The website now lives at alchemy.run.</description><pubDate>Fri, 17 Jul 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.63 moves &lt;strong&gt;Durable Object classes between Workers&lt;/strong&gt; with
their data intact, lets &lt;strong&gt;Actions bind resources&lt;/strong&gt; and read
Outputs with your CLI credentials, and makes &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt;&lt;/strong&gt;
work from any folder. The website now lives at
&lt;a href=&quot;https://alchemy.run&quot;&gt;alchemy.run&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;move-a-durable-object-to-another-worker&quot;&gt;Move a Durable Object to another Worker&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A Durable Object class can now move between Workers &lt;strong&gt;with its
data intact&lt;/strong&gt; — same instances, same storage — via Cloudflare’s
&lt;code dir=&quot;auto&quot;&gt;transferred_classes&lt;/code&gt; migration
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/803&quot;&gt;#803&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Moves are always declared. A class that disappears from one
Worker and appears on another is ambiguous between “transfer the
data” and “delete it, start fresh”, so Alchemy never guesses.
The class states where it came from:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;increment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;number&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; never&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RuntimeContext&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;number&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; never&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RuntimeContext&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { transferredFrom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;WorkerA&quot;&lt;/span&gt;&lt;span&gt; }) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Whichever Worker hosts &lt;code dir=&quot;auto&quot;&gt;Counter&lt;/code&gt; next transfers the namespace
from &lt;code dir=&quot;auto&quot;&gt;WorkerA&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;transferredFrom&lt;/code&gt; accepts a Worker logical id, a
physical script name (for cross-stack moves), the Worker class
itself, or a thunk for import cycles.&lt;/p&gt;
&lt;p&gt;The declaration is a host &lt;em&gt;history&lt;/em&gt;: after a second move you
write &lt;code dir=&quot;auto&quot;&gt;transferredFrom: [&quot;WorkerA&quot;, &quot;WorkerB&quot;]&lt;/code&gt;, and the
namespace transfers from whichever listed host currently holds
it — so a stage that lagged behind or skipped a release still
converges. Once a transfer completes, the declaration is inert
and safe to keep in code forever.&lt;/p&gt;
&lt;p&gt;If you move a host without declaring it, the deploy fails
&lt;strong&gt;before any upload&lt;/strong&gt; with the typed
&lt;code dir=&quot;auto&quot;&gt;DurableObjectTransferRequired&lt;/code&gt; error, naming the exact
declaration to add. Durable Object data is never silently
destroyed or forked.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/cross-worker-durable-object&quot;&gt;Bind to another Worker’s Durable
Object&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bind-resources-inside-actions&quot;&gt;Bind resources inside Actions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-05-13-beta-38&quot;&gt;Actions&lt;/a&gt; run arbitrary Effects during
deploy — seed a database, ping Slack, invalidate a cache. They
can now &lt;strong&gt;bind resources&lt;/strong&gt; the same way a Worker does, and read
resource &lt;strong&gt;Outputs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/807&quot;&gt;#807&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Seed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Seed&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabase&lt;/span&gt;&lt;span&gt;(database)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;databaseId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;database&lt;/span&gt;&lt;span&gt;.databaseId&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;CREATE TABLE IF NOT EXISTS users (id TEXT, name TEXT)&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { databaseId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; databaseId }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;QueryDatabaseLocal&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code dir=&quot;auto&quot;&gt;*Local&lt;/code&gt; layers make this work. They’re a third binding
variant alongside &lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt; (native Worker binding) and &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;
(scoped API token): a &lt;code dir=&quot;auto&quot;&gt;*Local&lt;/code&gt; layer authenticates with your
&lt;strong&gt;current CLI credentials&lt;/strong&gt; and returns the same typed client,
so an Action running on your machine or in CI talks to the same
data plane your Worker would. Every Cloudflare capability with
an HTTP data plane has one — D1, KV, R2, Queues, DNS, Vectorize,
Tunnel, AI Search, Browser Rendering, and more.&lt;/p&gt;
&lt;p&gt;Reading &lt;code dir=&quot;auto&quot;&gt;yield* database.databaseId&lt;/code&gt; inside an Action also
records a dependency edge, so the Action waits for the database
to exist before it runs.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-login-works-anywhere&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; works anywhere&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; no longer requires an &lt;code dir=&quot;auto&quot;&gt;alchemy.run.ts&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/842&quot;&gt;#842&lt;/a&gt;). With
no entrypoint in sight, it offers every built-in auth provider
and configures the ones you pick, so you can set up or refresh
credentials from any folder:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ cd /some/empty/dir &amp;#x26;&amp;#x26; alchemy login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;No alchemy.run.ts found — using Alchemy&apos;s built-in providers.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;◆  Select providers to log in with&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◻ AWS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◻ Axiom&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◻ Cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◼ GitHub (configured)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◻ Neon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;│  ◻ Planetscale&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Already-configured providers are pre-selected and labeled. In
CI the prompt is skipped and all built-ins are configured
non-interactively. With an &lt;code dir=&quot;auto&quot;&gt;alchemy.run.ts&lt;/code&gt; present, behavior is
unchanged.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cli/login&quot;&gt;alchemy login&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-website-moved-to-alchemyrun&quot;&gt;The website moved to alchemy.run&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The v2 site now serves from the apex domain, and
&lt;code dir=&quot;auto&quot;&gt;v2.alchemy.run&lt;/code&gt; 301s to it at the edge
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/806&quot;&gt;#806&lt;/a&gt;). The
redirect is itself deployed by Alchemy — a
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Ruleset&lt;/code&gt; on the adopted zone:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Ruleset&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Ruleset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;V2Redirect&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;zone&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;phase&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http_request_dynamic_redirect&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expression&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;http.host eq &quot;v2.alchemy.run&quot;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;action&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;redirect&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;actionParameters&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromValue&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;targetUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { expression&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;concat(&quot;https://alchemy.run&quot;, http.request.uri.path)&apos;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preserveQueryString&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;statusCode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;a-new-test-runner&quot;&gt;A new test runner&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This release also lands &lt;code dir=&quot;auto&quot;&gt;alchemy-test&lt;/code&gt;, the Effect-native test
runner that executes our 4,000+ live-cloud test suite in a
single bun process
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/848&quot;&gt;#848&lt;/a&gt;). It
got its own post: &lt;a href=&quot;https://alchemy.run/blog/2026-07-22-a-test-runner-for-agents&quot;&gt;A Test Runner for Agents and
Humans&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Durable Object metadata packs into a single script tag&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/824&quot;&gt;#824&lt;/a&gt;) —
one tag per DO binding blew Cloudflare’s 10-tag-per-Worker
limit at 7+ DOs; all mappings now fit in one tag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite-based Workers hash sibling workspace packages&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/822&quot;&gt;#822&lt;/a&gt;) —
editing only a sibling package used to skip the deploy and
serve stale code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alchemy’s Vite plugin no longer double-registers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/833&quot;&gt;#833&lt;/a&gt;) —
apps that also build standalone keep the plugin in their
&lt;code dir=&quot;auto&quot;&gt;vite.config.ts&lt;/code&gt;; Alchemy signals its own injection via
&lt;code dir=&quot;auto&quot;&gt;ALCHEMY_CLOUDFLARE_VITE_INJECTED&lt;/code&gt;. Thanks &lt;strong&gt;Alex&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MySQL replicas reconcile in place&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/825&quot;&gt;#825&lt;/a&gt;) —
changing &lt;code dir=&quot;auto&quot;&gt;replicas&lt;/code&gt; on a PlanetScale MySQL database resizes
the keyspace instead of replacing the database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unresolved Outputs never persist in state&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/835&quot;&gt;#835&lt;/a&gt;) —
an interrupted create could snapshot live &lt;code dir=&quot;auto&quot;&gt;Output&lt;/code&gt; proxies
into state and poison later reads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-bound &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; resolves in request handlers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/829&quot;&gt;#829&lt;/a&gt;) —
re-yielding a &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; inside a handler decoded the secret
marker JSON instead of the value.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;proxyChain&lt;/code&gt; values pass &lt;code dir=&quot;auto&quot;&gt;Effect.isEffect&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/827&quot;&gt;#827&lt;/a&gt;) —
chained Drizzle clients now work with predicate-dispatched
operators like &lt;code dir=&quot;auto&quot;&gt;Effect.catchTag&lt;/code&gt;. Thanks &lt;strong&gt;Julian Archila&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/cross-worker-durable-object&quot;&gt;Bind to another Worker’s Durable Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cli/login&quot;&gt;alchemy login&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-07-22-a-test-runner-for-agents&quot;&gt;A Test Runner for Agents and Humans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta63&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.62...v2.0.0-beta.63&quot;&gt;Compare v2.0.0-beta.62 → v2.0.0-beta.63&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.62 - Build-Once Workers &amp; GitHub Action</title><link>https://alchemy.run/blog/2026-07-14-beta-62/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-14-beta-62/</guid><description>v2.0.0-beta.62 makes Workers build their layer stack once per isolate instead of on every request. It also adds an official GitHub Action, PlanetScale OAuth login, a custom Worker entry for Vite websites, and a batch of alchemy dev fixes.</description><pubDate>Tue, 14 Jul 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.62 makes Workers build their layer stack &lt;strong&gt;once per isolate&lt;/strong&gt;
instead of on every request. It also adds an official &lt;strong&gt;GitHub
Action&lt;/strong&gt;, &lt;strong&gt;PlanetScale OAuth login&lt;/strong&gt;, a &lt;strong&gt;custom Worker entry&lt;/strong&gt;
for Vite websites, and a batch of &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; fixes.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt; — migration for each is below.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Worker layers build once per isolate, not once per request&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/774&quot;&gt;#774&lt;/a&gt;).
Connections and pools move from init to the handler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-beta.97&lt;/code&gt; is required&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/801&quot;&gt;#801&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/813&quot;&gt;#813&lt;/a&gt;).
effect removed several &lt;code dir=&quot;auto&quot;&gt;Schedule&lt;/code&gt; APIs. Alchemy is migrated and
the peer floor is raised to match.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;layers-build-once-per-isolate&quot;&gt;Layers build once per isolate&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Worker bridge used to rebuild your entire layer stack on
&lt;strong&gt;every request&lt;/strong&gt;. Every &lt;code dir=&quot;auto&quot;&gt;Layer.effect&lt;/code&gt;, config decode, and client
constructor re-ran per event. Now layers build once, on the first
event. Every later event reuses them
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/774&quot;&gt;#774&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// init: runs once per isolate. beta.61 ran this on every request.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;HttpClient&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;https://example.com/config.json&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.json&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// handler: runs per event, reusing the cached config&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(config)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Init cost is paid once at cold start. After that, every request
goes straight to the handler. Durable Objects get the same win:
one layer build shared across activations.&lt;/p&gt;
&lt;p&gt;Sharing one build across events needs cross-request async. One
event awaits a layer build that another event started. workerd
normally forbids this: a promise created in one request context
can’t be resolved from another. So alchemy enables the
&lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#handle-cross-request-promise-resolution-correctly&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;handle_cross_request_promise_resolution&lt;/code&gt;&lt;/a&gt;
compatibility flag automatically for Workers with a compatibility
date before 2024-10-14. Later dates enable it by default. Each
awaiting event also pins the in-flight build with &lt;code dir=&quot;auto&quot;&gt;ctx.waitUntil&lt;/code&gt;,
so workerd doesn’t drop the continuation when the original request
ends. Opting out with &lt;code dir=&quot;auto&quot;&gt;no_handle_cross_request_promise_resolution&lt;/code&gt;
is a deploy-time error.&lt;/p&gt;
&lt;p&gt;There is one migration. Anything &lt;strong&gt;disposable&lt;/strong&gt; moves out of init
and into the handler. The handler’s per-event &lt;code dir=&quot;auto&quot;&gt;Scope&lt;/code&gt; runs its
finalizers after the response:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ❌ init: workerd has no isolate teardown, so this finalizer never runs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acquirePool&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// ✅ handler: acquired per event, released when the event settles&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;conn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acquireConn&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You can still declare the resource in init and use it at runtime.
An Effect is only a description, so declaring one in init acquires
nothing:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PgClient&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;@effect/sql-pg/PgClient&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// init: declare the client. Nothing connects yet.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PgClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;({ url })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// handler: connects on this event&apos;s Scope&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; client&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`select * from users`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(rows)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The pool is acquired on the event’s &lt;code dir=&quot;auto&quot;&gt;Scope&lt;/code&gt; and released when the
event settles.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;proxyChain&lt;/code&gt; removes the extra &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt;. It wraps the deferred
client in a chainable handle. Yielding a query resolves the client
on the current event’s &lt;code dir=&quot;auto&quot;&gt;Scope&lt;/code&gt;, then replays the chain against it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;proxyChain&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Util/proxy-chain&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// init: a chainable handle over the deferred client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proxyChain&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;PgClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;({ url }))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`select * from users`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(rows)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Drizzle.postgres&lt;/code&gt; is this pattern plus &lt;code dir=&quot;auto&quot;&gt;Effect.cached&lt;/code&gt; to memoize
the acquisition per event. The first query opens the pool, every
later query in the same event reuses it, and the pool closes when
the event settles:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// init: declares the handle. No connection is made.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Drizzle&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hyperdrive&lt;/span&gt;&lt;span&gt;.connectionString)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// first query builds the pool, memoized on this event&apos;s Scope&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(users)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;(rows)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;See
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/packages/alchemy/src/Drizzle/Postgres.ts&quot;&gt;Postgres.ts&lt;/a&gt;
for the full implementation. It is also why &lt;code dir=&quot;auto&quot;&gt;Drizzle.postgres&lt;/code&gt; now
works inside Durable Object methods.&lt;/p&gt;
&lt;p&gt;Lambda gets a real shutdown from the same change. The generated
entry registers an internal extension, so the instance receives
SIGTERM and a ~500 ms window to run init-level finalizers.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/runtime#instance-scope-vs-request-scope&quot;&gt;Instance scope vs request
scope&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;deploy-from-github-actions&quot;&gt;Deploy from GitHub Actions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One step resolves the Alchemy lifecycle from the GitHub event.
Opening a PR deploys a &lt;code dir=&quot;auto&quot;&gt;staging-{pr}&lt;/code&gt; stage, closing it destroys
the stage, and pushing to main deploys &lt;code dir=&quot;auto&quot;&gt;prod&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/699&quot;&gt;#699&lt;/a&gt;).
Thanks &lt;strong&gt;Harry Solovay&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy-run/alchemy@v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;code dir=&quot;auto&quot;&gt;GitHub.GitHubEnv&lt;/code&gt; config exposes the Actions metadata to
your stack. It resolves to &lt;code dir=&quot;auto&quot;&gt;undefined&lt;/code&gt; outside CI, so the same
stack runs unchanged locally:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/GitHub&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GitHubEnv&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;?.pr) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Comment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;preview-comment&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;.owner&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repository&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;.repository&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;issueNumber&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;.pr&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`Preview for ${&lt;/span&gt;&lt;span&gt;github&lt;/span&gt;&lt;span&gt;.sha&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/environments/ci&quot;&gt;CI&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;planetscale-oauth-login&quot;&gt;PlanetScale OAuth login&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt; now offers browser-based OAuth for PlanetScale,
the same flow as Cloudflare
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/467&quot;&gt;#467&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# authorize in the browser → token stored, refreshed proactively&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Env vars and service tokens keep working. Both providers now land
on shared &lt;code dir=&quot;auto&quot;&gt;/auth/success&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;/auth/error&lt;/code&gt; pages
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/780&quot;&gt;#780&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;custom-worker-entry-for-vite-websites&quot;&gt;Custom Worker entry for Vite websites&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Website.Vite&lt;/code&gt; accepts a &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; prop that forwards a
custom Worker entry to the Vite plugin, in dev and deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/779&quot;&gt;#779&lt;/a&gt;).
Thanks &lt;strong&gt;Daniel Gangl&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// worker/index.ts: export more than the framework&apos;s fetch handler&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;virtual:react-router/unstable_rsc/server&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;MyDurableObject&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./my-durable-object&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;handler&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Website&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Vite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rootDir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./site/worker/index.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;React Router / RSC setups need this. The framework plugin owns the
entry, so the old &lt;code dir=&quot;auto&quot;&gt;rollupOptions.input&lt;/code&gt; workaround doesn’t apply.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-dev-reliability&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; reliability&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hot reload no longer kills service bindings&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/812&quot;&gt;#812&lt;/a&gt;) —
reloading a worker used to delete its replacement’s registration,
so RPC calls failed with &lt;code dir=&quot;auto&quot;&gt;Worker not found&lt;/code&gt; after every backend
change. Thanks &lt;strong&gt;utopy&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container environment variables work in dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/785&quot;&gt;#785&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev container images persist across restarts&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/727&quot;&gt;#727&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote images and external Dockerfiles work in
&lt;code dir=&quot;auto&quot;&gt;LocalContainerProvider&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/790&quot;&gt;#790&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The provider RPC session is cached and reused&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/789&quot;&gt;#789&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev-URL detection favors localhost/IP URLs&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/787&quot;&gt;#787&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;plan&lt;/code&gt; no longer claims ownership of adopted resources&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/794&quot;&gt;#794&lt;/a&gt;) —
a read-only dry run could silently adopt an unowned cloud
resource, and a later unrelated deploy would orphan-delete it.
Thanks &lt;strong&gt;Daniel Gangl&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State-store credentials are bound to the account&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/760&quot;&gt;#760&lt;/a&gt;) —
after &lt;code dir=&quot;auto&quot;&gt;alchemy login --configure&lt;/code&gt; switched accounts, state
reads/writes silently kept going to the old account’s store.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider handlers receive the resource &lt;code dir=&quot;auto&quot;&gt;fqn&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/783&quot;&gt;#783&lt;/a&gt;) —
the fully-qualified name joins &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; in every lifecycle handler,
so custom providers can stamp collision-free ownership metadata.
Thanks &lt;strong&gt;Daniel Gangl&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cron handlers keep their requirements&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/791&quot;&gt;#791&lt;/a&gt;) —
services required by a &lt;code dir=&quot;auto&quot;&gt;Workers.cron&lt;/code&gt; handler surface on the
Worker’s init effect again. Thanks &lt;strong&gt;Jack Bisceglia&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite build output is read after the build resolves&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/795&quot;&gt;#795&lt;/a&gt;) —
fixes a bundling race in &lt;code dir=&quot;auto&quot;&gt;Website&lt;/code&gt; deploys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container healthcheck durations are unit-suffixed&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/778&quot;&gt;#778&lt;/a&gt;) —
Docker rejects bare numbers. Thanks &lt;strong&gt;Matthew Aylward&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy state clear&lt;/code&gt; respects &lt;code dir=&quot;auto&quot;&gt;ALCHEMY_PROFILE&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/commit/ba70585f&quot;&gt;ba705&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript 7 (stable) toolchain&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/804&quot;&gt;#804&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New guides&lt;/strong&gt;: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/worker-loader&quot;&gt;Worker Loader&lt;/a&gt;,
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/rate-limiting&quot;&gt;Rate limiting&lt;/a&gt;, and
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/cache&quot;&gt;Workers Cache&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/805&quot;&gt;#805&lt;/a&gt;),
plus a TanStack + Atom RPC + Drizzle example
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/634&quot;&gt;#634&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/runtime#instance-scope-vs-request-scope&quot;&gt;Instance scope vs request scope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/ci&quot;&gt;CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workers&quot;&gt;Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/cache&quot;&gt;Workers Cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta62&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.61...v2.0.0-beta.62&quot;&gt;Compare v2.0.0-beta.61 → v2.0.0-beta.62&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.61 - Workers Cache, Routes &amp; Sync</title><link>https://alchemy.run/blog/2026-07-08-beta-61/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-08-beta-61/</guid><description>v2.0.0-beta.61 adds Workers Cache with an Effect-native ExecutionContext, Wrangler-style zone routes, alchemy sync for repairing state drift, a full Workflows API (retries, rollback, events), resource type aliases, and a long list of reliability fixes.</description><pubDate>Wed, 08 Jul 2026 06:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.61 adds &lt;strong&gt;Workers Cache&lt;/strong&gt; with an Effect-native
&lt;code dir=&quot;auto&quot;&gt;ExecutionContext&lt;/code&gt;, Wrangler-style &lt;strong&gt;zone routes&lt;/strong&gt;, &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy sync&lt;/code&gt;&lt;/strong&gt; for repairing out-of-band drift, a much fuller
&lt;strong&gt;Workflows&lt;/strong&gt; API (retries, rollback, events), &lt;strong&gt;resource type
aliases&lt;/strong&gt; that heal the beta.59 renames, and a long list of
reliability fixes.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt; — migration for each is below.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;workflow.create&lt;/code&gt; takes the native options object&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;create(input)&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;create({ params: input })&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/611&quot;&gt;#611&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;WorkerExecutionContext&lt;/code&gt; is now an Effect wrapper&lt;/strong&gt; — it’s no
longer the raw &lt;code dir=&quot;auto&quot;&gt;cf.ExecutionContext&lt;/code&gt;; &lt;code dir=&quot;auto&quot;&gt;waitUntil&lt;/code&gt; takes an
&lt;code dir=&quot;auto&quot;&gt;Effect&lt;/code&gt; and is &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt;-ed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/752&quot;&gt;#752&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;effect &lt;code dir=&quot;auto&quot;&gt;&gt;=4.0.0-beta.93&lt;/code&gt; is required&lt;/strong&gt; — effect moved
&lt;code dir=&quot;auto&quot;&gt;UrlParams.makeUrl&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;Url.make&lt;/code&gt;; the peer range floor is raised
to match
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/748&quot;&gt;#748&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;workers-cache&quot;&gt;Workers Cache&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/workers-cache/&quot;&gt;Workers Cache&lt;/a&gt; —
Cloudflare’s regionally tiered cache in front of Worker
entrypoints — lands as both a binding and a prop
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/752&quot;&gt;#752&lt;/a&gt;).
Effect-native Workers enable it with &lt;code dir=&quot;auto&quot;&gt;Cloudflare.cache()&lt;/code&gt;, which
also returns the typed purge client:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// init: enables Workers Cache on this Worker at deploy time&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;purge&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;({ crossVersionCache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;/invalidate&quot;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;purge&lt;/span&gt;&lt;span&gt;({ tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;products&quot;&lt;/span&gt;&lt;span&gt;] })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// typed CachePurgeError&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;purged&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hello&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;Cache-Control&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;public, max-age=300, stale-while-revalidate=3600&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&quot;Cache-Tag&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;products&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Async Workers use the prop:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; crossVersionCache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-native-executioncontext&quot;&gt;Effect-native &lt;code dir=&quot;auto&quot;&gt;ExecutionContext&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;WorkerExecutionContext&lt;/code&gt; used to hand you the raw
&lt;code dir=&quot;auto&quot;&gt;cf.ExecutionContext&lt;/code&gt;. It’s now an Effect wrapper — and like
&lt;code dir=&quot;auto&quot;&gt;DurableObjectState&lt;/code&gt;, it can be yielded from the Worker’s &lt;strong&gt;init
closure&lt;/strong&gt; (or any Layer); its methods resolve the live per-event
context:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkerExecutionContext&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// respond now, finish work in the background&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitUntil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;journal&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;record&lt;/span&gt;&lt;span&gt;(entry).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;delay&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;5 seconds&quot;&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Migrating is mechanical — &lt;code dir=&quot;auto&quot;&gt;ctx.waitUntil(promise)&lt;/code&gt; becomes
&lt;code dir=&quot;auto&quot;&gt;yield* exec.waitUntil(effect)&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;zone-routes-on-workers&quot;&gt;Zone Routes on Workers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt; accepts Wrangler-style zone routes via a new
&lt;code dir=&quot;auto&quot;&gt;routes&lt;/code&gt; prop
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/438&quot;&gt;#438&lt;/a&gt;).
Thanks &lt;strong&gt;utopy&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;routes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ pattern&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;api.example.com/*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; zoneName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ pattern&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com/api/*&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; zoneId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;#x3C;YOUR_ZONE_ID&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each entry takes &lt;code dir=&quot;auto&quot;&gt;zoneName&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;zoneId&lt;/code&gt; (the Wrangler equivalents)
or a &lt;code dir=&quot;auto&quot;&gt;zone&lt;/code&gt; reference — and when the zone is omitted, it’s inferred
from the pattern hostname. Routes are reconciled on deploy and
cleaned up on destroy.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-sync&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy sync&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloud state drifts: someone edits a resource in the dashboard, a
bucket gets deleted, tags get mangled. &lt;code dir=&quot;auto&quot;&gt;alchemy sync&lt;/code&gt; converges it
back to the last-deployed state — without re-running your stack
program
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/766&quot;&gt;#766&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./alchemy.run.ts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# detect + repair&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sync&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./alchemy.run.ts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# detect only&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Per resource it runs observe → compare → converge: &lt;code dir=&quot;auto&quot;&gt;read&lt;/code&gt; observes
the live cloud state, a deep-compare against the persisted
attributes decides &lt;code dir=&quot;auto&quot;&gt;unchanged&lt;/code&gt; vs drifted, and drift is repaired by
&lt;code dir=&quot;auto&quot;&gt;reconcile&lt;/code&gt; with the persisted props as the desired state. A
resource deleted out-of-band is recreated under the &lt;strong&gt;same
instance id&lt;/strong&gt;, so deterministic physical names regenerate
identically. Resources sync concurrently, and failures are
aggregated after every resource has been attempted.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workflows-retries-rollback-and-events&quot;&gt;Workflows: retries, rollback, and events&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Effect-native Workflow wrapper now covers the full Workers API
surface, 1:1 with the native binding
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/611&quot;&gt;#611&lt;/a&gt;).
Thanks &lt;strong&gt;Gerben Mulder&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;create&lt;/code&gt; takes the native options object — the breaking change
above — which also unlocks &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;retention&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflow&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;({ orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;abc&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;workflow&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;order-abc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { orderId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;abc&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retention&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { successRetention&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1 day&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; errorRetention&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;7 days&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;task&lt;/code&gt; gains retries, timeout, and rollback, and
&lt;code dir=&quot;auto&quot;&gt;WorkflowStepContext&lt;/code&gt; exposes the current attempt:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflows&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;call-api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflows&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkflowStepContext&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; { attempt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.attempt }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retries&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { limit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; delay&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;5 seconds&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; backoff&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;linear&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;rollback&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ({ output }) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; (output &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cleanup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.id) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.void)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;waitForEvent&lt;/code&gt; parks the instance until a matching &lt;code dir=&quot;auto&quot;&gt;sendEvent&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// inside the workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;approval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflows&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;waitForEvent&amp;#x3C;{ &lt;/span&gt;&lt;span&gt;approved&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; boolean }&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;approval&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;approval&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;1 day&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// from outside&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sendEvent&lt;/span&gt;&lt;span&gt;({ type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;approval&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; payload&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { approved&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; } })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;createBatch&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;restart&lt;/code&gt;, rollback status, and extended event
metadata round out the surface. Docs:
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows&quot;&gt;Workflows&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;resource-type-aliases&quot;&gt;Resource type aliases&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Renaming a resource’s type string used to strand state persisted
under the old name — provider lookup died on the legacy type.
Resources now declare their former names
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/765&quot;&gt;#765&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Resource&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Queue&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Cloudflare.Queues.Queue&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aliases&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;Cloudflare.Queue&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Plan, apply, destroy, &lt;code dir=&quot;auto&quot;&gt;logs&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;tail&lt;/code&gt; all resolve providers
through aliases, and a noop deploy migrates state rows to the
canonical name. All &lt;strong&gt;74 resources&lt;/strong&gt; renamed in the beta.59
namespace alignment are annotated with their pre-rename alias — so
state written by beta.58 or earlier now deploys, destroys, and
replaces cleanly instead of erroring on the legacy type.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ai-gateway-byok-aiproviderkey&quot;&gt;AI Gateway BYOK: &lt;code dir=&quot;auto&quot;&gt;AI.ProviderKey&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A bring-your-own-key provider on an AI Gateway needs two coordinated
resources — a Secrets Store &lt;code dir=&quot;auto&quot;&gt;Secret&lt;/code&gt; with an exact
&lt;code dir=&quot;auto&quot;&gt;{gatewayId}_{providerSlug}_{alias}&lt;/code&gt; name, and a &lt;code dir=&quot;auto&quot;&gt;GatewayProvider&lt;/code&gt;
that references it. &lt;code dir=&quot;auto&quot;&gt;Cloudflare.AI.ProviderKey&lt;/code&gt; owns that contract
as one resource
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/586&quot;&gt;#586&lt;/a&gt;).
Thanks &lt;strong&gt;Alex&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gatewayProvider&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ProviderKey&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;OpenAiKey&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;store&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gatewayId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;span&gt;.gatewayId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;providerSlug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;openai&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;redacted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;OPENAI_API_KEY&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/ai/ai-gateway&quot;&gt;AI Gateway&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;lambda-async-invocation-config&quot;&gt;Lambda async invocation config&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Lambda’s asynchronous invocation settings — retries, event age,
success/failure destinations — land as an &lt;code dir=&quot;auto&quot;&gt;eventInvokeConfig&lt;/code&gt; prop
on &lt;code dir=&quot;auto&quot;&gt;Function&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Alias&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/627&quot;&gt;#627&lt;/a&gt;).
Thanks &lt;strong&gt;José Netto&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AsyncFn&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/handler.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;eventInvokeConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maximumRetryAttempts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maximumEventAgeInSeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;destinationConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OnFailure&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Destination&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span&gt;.queueArn }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;r2-bucket-cors&quot;&gt;R2 Bucket &lt;code dir=&quot;auto&quot;&gt;cors&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;cors&lt;/code&gt; prop that &lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.Bucket&lt;/code&gt; had in v1 is restored
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/771&quot;&gt;#771&lt;/a&gt;) —
public buckets serving browser range-reads (e.g. PMTiles) declare
CORS in the stack again instead of out-of-band:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Tiles&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;tiles.example.com&quot;&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedMethods&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;GET&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;HEAD&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedOrigins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;https://map.example.com&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedHeaders&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;range&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;exposeHeaders&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;etag&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;content-range&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxAgeSeconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3600&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Rules use the flat S3-style shape and reconcile like
&lt;code dir=&quot;auto&quot;&gt;lifecycleRules&lt;/code&gt; — observed vs desired, so out-of-band drift and
adoption converge correctly.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Worker metadata-only changes now deploy&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/747&quot;&gt;#747&lt;/a&gt;) —
compatibility flags/date, observability, placement, limits, and
binding changes are folded into the update diff via a metadata
hash; previously they planned as noops and silently never
shipped. The first deploy after upgrading plans a one-time update
per Worker to backfill the hash. Thanks &lt;strong&gt;Alex&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wedged stacks recover&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/767&quot;&gt;#767&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/770&quot;&gt;#770&lt;/a&gt;) —
a deploy interrupted mid-create used to persist a state row whose
Output-valued props can’t round-trip, crashing every subsequent
&lt;code dir=&quot;auto&quot;&gt;plan&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;destroy&lt;/code&gt;. Every provider’s &lt;code dir=&quot;auto&quot;&gt;read&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;diff&lt;/code&gt; is
audited so the engine re-drives the create and reconcile
converges on the half-created resource.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script uploads retry every binding-target-not-found error&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/753&quot;&gt;#753&lt;/a&gt;) —
KV, R2, D1, Queues, DO classes, Hyperdrive, Vectorize, and more,
covering Cloudflare’s deploy-time propagation lag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Resource.ref&lt;/code&gt; values bind natively in Worker &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/756&quot;&gt;#756&lt;/a&gt;) —
a ref passed as an env binding used to degrade to a plain JSON
env var and break at runtime; refs now classify exactly like
locally-declared resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple queue consumers on one Worker&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/466&quot;&gt;#466&lt;/a&gt;) —
event dispatch runs every listener for an event type instead of
letting the first queue subscription swallow the rest. Thanks
&lt;strong&gt;Leonardo E. Dominguez&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State-store errors are actionable&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/737&quot;&gt;#737&lt;/a&gt;) —
30 days of production traces triaged; empty &lt;code dir=&quot;auto&quot;&gt;StateStoreError:&lt;/code&gt;
messages, opaque decode errors, and JSON-parse crashes now
surface real messages (an unauthorized store tells you to run
&lt;code dir=&quot;auto&quot;&gt;alchemy login&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The test suite passes on Windows&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/735&quot;&gt;#735&lt;/a&gt;) —
including two real product fixes: &lt;code dir=&quot;auto&quot;&gt;Drizzle.Schema&lt;/code&gt; passed
OS-native paths to drizzle-kit (backslashes are glob escapes),
and &lt;code dir=&quot;auto&quot;&gt;Bundle.PurePlugin&lt;/code&gt; could be hijacked by a stray
&lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt; above &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drizzle query chains are real Effects&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/750&quot;&gt;#750&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;db.select()...&lt;/code&gt; chains now expose the full Effect protocol, so
they compose with &lt;code dir=&quot;auto&quot;&gt;Effect.all&lt;/code&gt; and friends instead of spinning
the run loop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlanetScale inherited roles compare by membership&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/761&quot;&gt;#761&lt;/a&gt;) —
API-returned ordering no longer forces a &lt;code dir=&quot;auto&quot;&gt;PostgresRole&lt;/code&gt;
replacement. Thanks &lt;strong&gt;Gerben Mulder&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;globalOutbound: null&lt;/code&gt; is preserved in &lt;code dir=&quot;auto&quot;&gt;WorkerLoader&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/746&quot;&gt;#746&lt;/a&gt;) —
the documented “block all outbound network access” signal no
longer silently coerces to default access. Thanks &lt;strong&gt;Alex&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binding-hosted DO classes join the precreate stub&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/764&quot;&gt;#764&lt;/a&gt;) —
fixes &lt;code dir=&quot;auto&quot;&gt;Worker did not expose Durable Object namespace&lt;/code&gt; on fresh
deploys of worker↔container cycles. Thanks &lt;strong&gt;Daniel Gangl&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; no longer prints bun’s benign tsconfig fd
warning&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/768&quot;&gt;#768&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows&quot;&gt;Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workers&quot;&gt;Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/networking/custom-domains&quot;&gt;Custom Domains &amp;#x26; Routes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/ai/ai-gateway&quot;&gt;AI Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta61&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.60...v2.0.0-beta.61&quot;&gt;Compare v2.0.0-beta.60 → v2.0.0-beta.61&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.60 - Docker, MicroVMs &amp; RSC</title><link>https://alchemy.run/blog/2026-07-06-beta-60/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-06-beta-60/</guid><description>v2.0.0-beta.60 adds a Docker provider, AWS Lambda MicroVMs, Workers for Platforms, React Server Components on Vite, class-based Workflows on async Workers, dramatically faster Cloudflare Container starts, and a ground-up docs overhaul.</description><pubDate>Mon, 06 Jul 2026 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.60 is a big one: a new &lt;strong&gt;Docker provider&lt;/strong&gt;, &lt;strong&gt;AWS Lambda
MicroVMs&lt;/strong&gt;, &lt;strong&gt;Workers for Platforms&lt;/strong&gt;, &lt;strong&gt;React Server Components&lt;/strong&gt;
on the Vite pipeline, class-based &lt;strong&gt;Workflows on async Workers&lt;/strong&gt;,
Cloudflare &lt;strong&gt;Containers&lt;/strong&gt; that start fast and stay up, and a
ground-up overhaul of the docs. No breaking changes this release.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;docker-provider&quot;&gt;Docker provider&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Docker&lt;/code&gt; brings &lt;code dir=&quot;auto&quot;&gt;Image&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;RemoteImage&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Volume&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;Network&lt;/code&gt; as Stack resources
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/649&quot;&gt;#649&lt;/a&gt;).
They drive the &lt;code dir=&quot;auto&quot;&gt;docker&lt;/code&gt; CLI’s active context — Docker Desktop, a
remote/SSH context, a CI daemon — and live in the same Stack as
your cloud resources. Thanks &lt;strong&gt;Austin&lt;/strong&gt;!&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RemoteImage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;postgres-image&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;postgres&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;18-alpine&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Network&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;app-network&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Volume&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;postgres-data&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;postgres&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docker&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;postgres&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; password }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// Redacted-safe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ external&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15432&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; internal&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5432&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ hostPath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; containerPath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/var/lib/postgresql/data&quot;&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;.name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; aliases&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;postgres&quot;&lt;/span&gt;&lt;span&gt;] }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Secrets are passed via process env (never on the CLI), pulled tags
are pinned so re-deploys are no-ops, and containers created outside
alchemy follow the standard adoption rules. See the new
&lt;a href=&quot;https://alchemy.run/docker&quot;&gt;Docker hub&lt;/a&gt; and the
&lt;a href=&quot;https://alchemy.run/docker/local-services&quot;&gt;local services guide&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;aws-lambda-microvms&quot;&gt;AWS Lambda MicroVMs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.MicrovmImage&lt;/code&gt; is a new Platform for snapshot-booted
microVMs (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/712&quot;&gt;#712&lt;/a&gt;).
Author the in-VM server in TypeScript — alchemy bundles it,
generates the Dockerfile, and builds the snapshot server-side — or
bring your own Dockerfile or a prebuilt artifact:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MicrovmImage&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;string&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Sandbox&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;buildRole&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (message) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`hello, ${&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;}!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () { &lt;/span&gt;&lt;span&gt;/* raw HTTP route */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Every instance operation — &lt;code dir=&quot;auto&quot;&gt;RunMicrovm&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;GetMicrovm&lt;/code&gt;,
suspend/resume/terminate, auth tokens, image builds — is a
&lt;code dir=&quot;auto&quot;&gt;Binding.Service&lt;/code&gt; with least-privilege IAM scoping, and
&lt;code dir=&quot;auto&quot;&gt;connectMicrovm&lt;/code&gt; gives you typed RPC into the running VM:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connectMicrovm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { endpoint&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; authToken })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reply&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;world&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It works cross-cloud too: binding a MicroVM operation from a
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt; mints an IAM user + assume-role Role so the
Worker can drive AWS MicroVMs at runtime.&lt;/p&gt;
&lt;p&gt;We also benchmarked MicroVMs against Cloudflare Containers — 700
isolated cold boots. MicroVMs boot in 2–4.5s regardless of what’s
inside; full results in
&lt;a href=&quot;https://alchemy.run/blog/2026-07-01-microvm-cold-starts&quot;&gt;Benchmarking Cloudflare Containers vs AWS MicroVMs&lt;/a&gt;.
Docs: &lt;a href=&quot;https://alchemy.run/aws/compute/microvms&quot;&gt;MicroVMs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workers-for-platforms&quot;&gt;Workers for Platforms&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Deploy user Workers into a dispatch namespace and route to them
dynamically (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/715&quot;&gt;#715&lt;/a&gt;).
A Worker deploys &lt;em&gt;into&lt;/em&gt; a namespace with the new &lt;code dir=&quot;auto&quot;&gt;namespace&lt;/code&gt; prop —
no duplicate resource type:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ns&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkersForPlatforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DispatchNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Customers&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;CustomerA&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ns&lt;/span&gt;&lt;span&gt;.name&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`export default { fetch() { return new Response(&quot;hi&quot;) } }`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The platform Worker binds the namespace Effect-natively, or via
&lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; for async Workers:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Effect-native — yield the binding, get a typed client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dispatch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkersForPlatforms&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Get&lt;/span&gt;&lt;span&gt;(namespace)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;userWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dispatch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;customer-a&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// async — DispatchNamespace is a valid env binding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;platform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Platform&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./handler.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;DISPATCH&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; namespace }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// handler.ts: env.DISPATCH.get(&quot;customer-a&quot;).fetch(request)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/workers-for-platforms&quot;&gt;Workers for Platforms&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;react-server-components-on-vite&quot;&gt;React Server Components on Vite&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Vite&lt;/code&gt; now supports builds that emit more than one
server environment — most notably RSC
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/685&quot;&gt;#685&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;viteEnvironments&lt;/code&gt; selects which environment produces the deployed
Worker entry and which additional server environments are bundled
alongside it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Vite&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ReactRouterRSC&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compatibility&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { flags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;viteEnvironments&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { entry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;rsc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; children&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span&gt;] }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A single-environment SSR build needs no configuration — the
default is &lt;code dir=&quot;auto&quot;&gt;{ entry: &quot;ssr&quot;, children: [] }&lt;/code&gt; — and the &lt;code dir=&quot;auto&quot;&gt;client&lt;/code&gt;
environment always deploys as static assets. The same PR replaces
the dev-server restart fingerprint with an exact structural
signature, so config changes are never silently missed. Docs:
&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Frontends on Cloudflare&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workflows-on-async-workers&quot;&gt;Workflows on async Workers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Class-based Cloudflare Workflows now bind to async (non-Effect)
Workers via &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;, mirroring class-based Durable Objects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/707&quot;&gt;#707&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AsyncWorker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Async&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/worker.ts&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;MY_WORKFLOW&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflow&lt;/span&gt;&lt;span&gt;&amp;#x3C;{ &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string }&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;className&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;InferEnv&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AsyncWorker&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// env.MY_WORKFLOW is the native Workflow&amp;#x3C;{ value: string }&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Your &lt;code dir=&quot;auto&quot;&gt;WorkflowEntrypoint&lt;/code&gt; class stays plain &lt;code dir=&quot;auto&quot;&gt;cloudflare:workers&lt;/code&gt;
code; alchemy provisions the workflow and emits the binding.
Cross-script references work with &lt;code dir=&quot;auto&quot;&gt;scriptName&lt;/code&gt;, same as async DOs.
Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows&quot;&gt;Workflows&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;containers-start-fast-and-stay-up&quot;&gt;Containers start fast and stay up&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare Containers deployed with alchemy behaved much worse
than the same image deployed with wrangler — at 100 concurrent
cold starts, ~2/100 succeeded. Two root causes, both fixed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/708&quot;&gt;#708&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wrangler-parity defaults&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;maxInstances&lt;/code&gt; defaulted to &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt;,
serializing every Durable Object through one container slot. Now
&lt;code dir=&quot;auto&quot;&gt;maxInstances: 20&lt;/code&gt;, scale-from-zero, and &lt;code dir=&quot;auto&quot;&gt;instanceType: &quot;lite&quot;&lt;/code&gt;
when no custom limits are set, matching wrangler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness polling&lt;/strong&gt; — probes had no per-probe timeout, so a
not-yet-listening port could hang for minutes. The loop now
mirrors &lt;code dir=&quot;auto&quot;&gt;@cloudflare/containers&lt;/code&gt; exactly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Result: 100/100 cold starts, on par with wrangler. And a container
that stops or crashes is now transparently restarted on the next
request, while a crash-looping container fails fast instead of
burning the readiness budget
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/711&quot;&gt;#711&lt;/a&gt;).
Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/containers&quot;&gt;Containers&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;effectful-compute-on-ecs-and-ec2&quot;&gt;Effectful compute on ECS and EC2&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;ServerHost&lt;/code&gt; + &lt;code dir=&quot;auto&quot;&gt;{ fetch }&lt;/code&gt; pattern now works end to end on
&lt;code dir=&quot;auto&quot;&gt;AWS.ECS.Task&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/713&quot;&gt;#713&lt;/a&gt;):
the container entry bundles a Bun HTTP server, ships every chunk
into the image, and builds for the architecture the task declares
— verified by a smoke test that deploys a real Fargate service
behind an ALB.&lt;/p&gt;
&lt;p&gt;The hosted &lt;code dir=&quot;auto&quot;&gt;AWS.EC2.Instance&lt;/code&gt; serves HTTP the same way, with a
reboot-safe systemd unit that self-heals transient boot failures
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/714&quot;&gt;#714&lt;/a&gt;).
And there’s a new &lt;code dir=&quot;auto&quot;&gt;AWS.EC2.KeyPair&lt;/code&gt; resource — the generated
private key is captured once as a &lt;code dir=&quot;auto&quot;&gt;Redacted&lt;/code&gt; secret:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keyPair&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EC2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KeyPair&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;DeployKey&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { keyType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ed25519&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// keyPair.keyName    -&gt; AWS.EC2.Instance({ keyName })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// keyPair.privateKey -&gt; Redacted&amp;#x3C;string&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;the-docs-got-a-ground-up-overhaul&quot;&gt;The docs got a ground-up overhaul&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The website is restructured into per-provider hubs behind a
horizontal tab bar — &lt;code dir=&quot;auto&quot;&gt;Core · CLI · Cloudflare · AWS · PlanetScale · Neon · More ▾&lt;/code&gt; — with ~100 new or reworked pages
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/721&quot;&gt;#721&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core&lt;/strong&gt; — Infrastructure as Code, Infrastructure as Effects,
APIs, Environments, State Store, Project structure, Testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt; — every command documented, including the first-ever
docs for &lt;code dir=&quot;auto&quot;&gt;alchemy unsafe nuke&lt;/code&gt; and adopting resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare / AWS hubs&lt;/strong&gt; — setup, five-part tutorials, block
pages and guides grouped by role (Compute, Frontend, APIs, Data,
Messaging, AI, …).&lt;/li&gt;
&lt;li&gt;Every page written against source, tests, and fixtures; every
moved URL 301s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start at &lt;a href=&quot;https://alchemy.run/&quot;&gt;the docs&lt;/a&gt; and pick your provider.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;--yes&lt;/code&gt; is fully non-interactive&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/728&quot;&gt;#728&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy deploy --yes&lt;/code&gt; now auto-accepts the Cloudflare state
store upgrade and deploy prompts instead of hanging on a non-TTY,
so CI needs no workarounds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial state-store deploys are detected and recovered&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/700&quot;&gt;#700&lt;/a&gt;) —
the store health check now verifies a real store is serving, not
just that a pre-create stub exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Command.Build&lt;/code&gt; memo includes command + env&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/738&quot;&gt;#738&lt;/a&gt;) —
two &lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; builds differing only in env (per-stage
&lt;code dir=&quot;auto&quot;&gt;EXPO_PUBLIC_*&lt;/code&gt;, API ids) no longer reuse each other’s output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retained resources report as &lt;code dir=&quot;auto&quot;&gt;retained&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/739&quot;&gt;#739&lt;/a&gt;) —
destroy no longer lists &lt;code dir=&quot;auto&quot;&gt;RemovalPolicy: &quot;retain&quot;&lt;/code&gt; resources as
deleted. Thanks &lt;strong&gt;bjorntechTobbe&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The CLI works on Windows&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/696&quot;&gt;#696&lt;/a&gt;) —
the stack entry loads via a &lt;code dir=&quot;auto&quot;&gt;file://&lt;/code&gt; URL. Thanks &lt;strong&gt;d3lay&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable Object classes created outside alchemy adopt cleanly&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/495&quot;&gt;#495&lt;/a&gt;) —
class migrations fall back to matching the observed binding, so
adopting a wrangler/dashboard Worker reuses its DO classes
instead of failing to re-create them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access Application survives state loss&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/742&quot;&gt;#742&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;read&lt;/code&gt; falls back to a domain scan and gates takeover behind
&lt;code dir=&quot;auto&quot;&gt;--adopt&lt;/code&gt;, instead of blindly creating a duplicate app with a
fresh &lt;code dir=&quot;auto&quot;&gt;aud&lt;/code&gt;. Thanks &lt;strong&gt;Andy Jefferson&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pooled connection origins&lt;/strong&gt; — Neon &lt;code dir=&quot;auto&quot;&gt;Project&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;Branch&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/718&quot;&gt;#718&lt;/a&gt;)
and PlanetScale &lt;code dir=&quot;auto&quot;&gt;PostgresRole&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/717&quot;&gt;#717&lt;/a&gt;)
expose &lt;code dir=&quot;auto&quot;&gt;pooledOrigin&lt;/code&gt;, and PlanetScale branch replica intent
persists so &lt;code dir=&quot;auto&quot;&gt;replicas: 0&lt;/code&gt; converges
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/719&quot;&gt;#719&lt;/a&gt;).
Thanks &lt;strong&gt;Alex&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS env-auth fixes&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Region&lt;/code&gt; is provided to STS during login
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/709&quot;&gt;#709&lt;/a&gt;)
and the &lt;code dir=&quot;auto&quot;&gt;Region&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;AWSEnvironment&lt;/code&gt; layer cycle in the account-id
lookup is broken
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/710&quot;&gt;#710&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/docker&quot;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/microvms&quot;&gt;MicroVMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workers-for-platforms&quot;&gt;Workers for Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows&quot;&gt;Workflows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-07-01-microvm-cold-starts&quot;&gt;Benchmarking Cloudflare Containers vs AWS MicroVMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta60&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.59...v2.0.0-beta.60&quot;&gt;Compare v2.0.0-beta.59 → v2.0.0-beta.60&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Looping the Generation of IaC and SDKs</title><link>https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory/</guid><description>AI agents write resources and live tests, run them against the real API, and every unmatched error becomes a typed patch to our generated SDK. One run of this loop grew Alchemy&apos;s Cloudflare provider from 22 resources to 230 and patched 720 SDK operations, most of it in 22 hours.</description><pubDate>Thu, 02 Jul 2026 16:00:00 GMT</pubDate><content:encoded>&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;svg viewBox=&quot;0 0 760 250&quot; role=&quot;img&quot; aria-label=&quot;The generation loop: write resources and live tests, run them against the real API, every unmatched error becomes an SDK patch and regeneration, retest until green, then ship the IaC and the truthful SDK together.&quot;&gt;&lt;defs&gt;&lt;marker id=&quot;alc-loop-arrow&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id=&quot;alc-loop-arrow-warn&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto-start-reverse&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot;&gt;&lt;/path&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;!-- nodes --&gt;&lt;rect x=&quot;20&quot; y=&quot;30&quot; width=&quot;200&quot; height=&quot;56&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;300&quot; y=&quot;30&quot; width=&quot;200&quot; height=&quot;56&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;580&quot; y=&quot;30&quot; width=&quot;160&quot; height=&quot;56&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;300&quot; y=&quot;170&quot; width=&quot;200&quot; height=&quot;56&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g text-anchor=&quot;middle&quot;&gt;&lt;text x=&quot;120&quot; y=&quot;53&quot;&gt;write resources&lt;/text&gt;&lt;text x=&quot;120&quot; y=&quot;72&quot;&gt;+ live tests&lt;/text&gt;&lt;text x=&quot;400&quot; y=&quot;53&quot;&gt;run against&lt;/text&gt;&lt;text x=&quot;400&quot; y=&quot;72&quot;&gt;the real API&lt;/text&gt;&lt;text x=&quot;660&quot; y=&quot;53&quot;&gt;ship IaC&lt;/text&gt;&lt;text x=&quot;660&quot; y=&quot;72&quot;&gt;+ truthful SDK&lt;/text&gt;&lt;text x=&quot;400&quot; y=&quot;193&quot;&gt;patch the SDK,&lt;/text&gt;&lt;text x=&quot;400&quot; y=&quot;212&quot;&gt;regenerate&lt;/text&gt;&lt;/g&gt;&lt;!-- forward flow --&gt;&lt;g&gt;&lt;line x1=&quot;220&quot; y1=&quot;45&quot; x2=&quot;296&quot; y2=&quot;45&quot; marker-end=&quot;url(#alc-loop-arrow)&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;500&quot; y1=&quot;58&quot; x2=&quot;576&quot; y2=&quot;58&quot; marker-end=&quot;url(#alc-loop-arrow)&quot;&gt;&lt;/line&gt;&lt;/g&gt;&lt;text x=&quot;538&quot; y=&quot;46&quot; text-anchor=&quot;middle&quot;&gt;all green&lt;/text&gt;&lt;!-- feedback loop --&gt;&lt;g&gt;&lt;line x1=&quot;420&quot; y1=&quot;86&quot; x2=&quot;420&quot; y2=&quot;166&quot; marker-end=&quot;url(#alc-loop-arrow-warn)&quot;&gt;&lt;/line&gt;&lt;path d=&quot;M300,198 H262 V70 H296&quot; marker-end=&quot;url(#alc-loop-arrow-warn)&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;430&quot; y=&quot;130&quot;&gt;unmatched error&lt;/text&gt;&lt;text x=&quot;252&quot; y=&quot;130&quot; text-anchor=&quot;end&quot;&gt;retest&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/&quot;&gt;Alchemy&lt;/a&gt; is a new Infrastructure-as-Code
framework built from the ground up in TypeScript and Effect.
Everything is typed code, from a resource’s inputs and outputs
down to the SDK calls and errors inside its lifecycle logic.&lt;/p&gt;
&lt;p&gt;Built from the ground up also means starting from zero
coverage. Alchemy can’t reuse the providers of existing IaC
ecosystems like Terraform or Pulumi, and we’re a team of
three, so hand-writing lifecycle code for thousands of cloud
resources isn’t an option. We generate it with AI, using the
loop in the diagram above.&lt;/p&gt;
&lt;p&gt;Fleets of AI agents write the resources and their live tests,
then run them against a real Cloudflare account. Every API
behavior the SDK’s types don’t capture becomes a patch to the
SDK, which regenerates and the tests rerun. One run of this
loop grew Alchemy’s Cloudflare provider from &lt;strong&gt;22 resources to
230&lt;/strong&gt; between June 11 and June 17, producing 288 test files
with roughly 700 tests and &lt;strong&gt;720 SDK patches&lt;/strong&gt;. Most of it
landed in a single PR
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/601&quot;&gt;#601&lt;/a&gt;)
that added 101,178 lines across 542 files and was open for 22
hours. The PR description, in its entirety:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using Fable to generate all missing cloudflare resources&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Deterministic codegen has been
producing SDKs and IaC providers from API specs for years, and
AI makes it even cheaper. The problem is that code generated
from a spec is only as truthful as the spec, and real APIs
drift from their specs. They return undocumented error codes,
misuse HTTP statuses, and null out fields the schema says are
required. That’s why the interesting number isn’t the 230
resources. It’s the 720 patches, each one a place where a live
test caught the API doing something its spec doesn’t admit to.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-software-development-flywheel&quot;&gt;A software development flywheel&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy’s resources are built on
&lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled&lt;/a&gt;, our
Effect-native SDK generated from Cloudflare’s official
TypeScript SDK. It covers 114 services and 2,092 operations,
and each operation can carry a patch, a small JSON file that
corrects the spec where reality disagrees with it.&lt;/p&gt;
&lt;p&gt;The run operated on one rule: &lt;strong&gt;agents never handle an unknown
error in their own code.&lt;/strong&gt; An unmatched error is never caught
in the resource. It becomes an SDK patch and a regeneration.
Untyped failure handling is where AI-generated code usually
goes wrong, matching message substrings or guessing status
codes. The rule takes that option away because the code
doesn’t typecheck until the SDK knows about the error. It also
makes the work compound. Every red test either fixes a
resource or improves the SDK for the next one.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-turn-of-the-flywheel&quot;&gt;One turn of the flywheel&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Infrastructure-as-code is mostly disciplined error handling.
Deletes tolerate already-gone. Creates absorb losing a race.
Reads ride out eventual consistency. In Alchemy that
discipline is typed:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// idempotent delete: reading back an already-gone widget is success&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;turnstile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWidget&lt;/span&gt;&lt;span&gt;({ accountId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; sitekey }).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;catchTag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;WidgetNotFound&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;undefined&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// R2&apos;s endpoint lags a fresh bucket create, so retry the not-found until it settles&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;r2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;listBucketDomainCustoms&lt;/span&gt;&lt;span&gt;({ accountId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; bucketName }).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (e) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;._tag &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;NoSuchBucket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Schedule&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exponential&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;100 millis&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Schedule&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;both&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Schedule&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;recurs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The agents write this code first, then run it against the real
API. A Turnstile test deletes a widget and reads it back to
prove it’s gone. The read fails with code &lt;code dir=&quot;auto&quot;&gt;10404&lt;/code&gt;, which the
spec doesn’t declare. The &lt;code dir=&quot;auto&quot;&gt;catchTag&lt;/code&gt; doesn’t typecheck because
&lt;code dir=&quot;auto&quot;&gt;WidgetNotFound&lt;/code&gt; isn’t in the error union yet, and the only
permitted fix is a patch in distilled:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;submodules/distilled/packages/cloudflare/patches/turnstile/getWidget.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;errors&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;WidgetNotFound&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ &lt;/span&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10404&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10407&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;Forbidden&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ &lt;/span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Regenerate the service (&lt;code dir=&quot;auto&quot;&gt;bun scripts/generate.ts --service turnstile&lt;/code&gt;) and the union names what the API actually does:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GetWidgetError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DefaultErrors&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WidgetNotFound&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Forbidden&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;catchTag&lt;/code&gt; compiles and the test goes green. The loop
continues through reconcile, read, diff, delete, and list
until the whole resource passes against the live API. The
resource is the product and the truthful SDK is the byproduct.
The patch lives in the SDK, not Alchemy, so anyone who uses
distilled’s Turnstile module from now on gets &lt;code dir=&quot;auto&quot;&gt;WidgetNotFound&lt;/code&gt;
as a typed, catchable error.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-1087-patches-look-like&quot;&gt;What 1,087 patches look like&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;By beta.56 the corpus stood at 1,087 patched operations,
covering 52% of the SDK across 94 of 114 services:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;patches declaring typed errors&lt;/td&gt;
&lt;td&gt;1,070&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;patches fixing a response schema&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;patches fixing a request schema&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;distinct error tags introduced&lt;/td&gt;
&lt;td&gt;425&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;matchers on Cloudflare error &lt;code dir=&quot;auto&quot;&gt;code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,367&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;matchers on HTTP &lt;code dir=&quot;auto&quot;&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;994&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;matchers needing &lt;code dir=&quot;auto&quot;&gt;message.includes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;377&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;matchers needing a regex&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Most tags are the vocabulary lifecycle code needs, like
&lt;code dir=&quot;auto&quot;&gt;Forbidden&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;WorkerNotFound&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;NoSuchBucket&lt;/code&gt;. The rest
catalog how APIs drift from their docs. Snippets returns 400
instead of 404 for a missing snippet, so the matcher reads the
message. Queues consumers support &lt;code dir=&quot;auto&quot;&gt;http_pull&lt;/code&gt; but the spec’s
enum doesn’t include it. Account settings come back null where
the schema says they can’t. None of this is discoverable by
reading documentation.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-factory&quot;&gt;The factory&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Around twelve agents ran concurrently, each owning one
distilled service. Only the owner of &lt;code dir=&quot;auto&quot;&gt;turnstile&lt;/code&gt; writes to
&lt;code dir=&quot;auto&quot;&gt;patches/turnstile/&lt;/code&gt;, so agents never race the generator.
Every test follows one shape: deploy, verify out-of-band by
querying the API directly through distilled, mutate, verify
again, destroy, and prove the destroy by watching the resource
disappear. A test never trusts the deploy’s own report of
success. It confirms every step against what the API actually
returns.&lt;/p&gt;
&lt;p&gt;Two choices kept the loop fast. distilled is a git submodule
inside alchemy’s bun workspace, so an agent patches the SDK
and the resource that consumes it in one working tree, and a
wave lands as two PRs, one to alchemy and one to
distilled. And vitest resolves distilled from its TypeScript
source, so a regenerated service is visible to the very next
test run. The loop’s cycle time is the test’s runtime.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We’re scaling this loop to every cloud provider, with two
goals: 100% IaC coverage in Alchemy, and refined SDKs whose
types align with each API’s real behavior rather than just its
spec. AWS is next, then Railway, GCP, and Azure. The
Cloudflare run was the proof, and it shipped in
&lt;a href=&quot;https://alchemy.run/blog/2026-06-17-beta-56&quot;&gt;2.0.0-beta.56&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-06-17-beta-56&quot;&gt;2.0.0-beta.56 — the release these resources shipped in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/601&quot;&gt;PR #601 — the generation wave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled — the generated, patchable SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/providers/cloudflare&quot;&gt;Cloudflare provider reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Benchmarking Cloudflare Containers vs AWS MicroVMs</title><link>https://alchemy.run/blog/2026-07-01-microvm-cold-starts/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-07-01-microvm-cold-starts/</guid><description>We benchmarked AWS Lambda MicroVMs against Cloudflare Containers — 700 isolated cold boots, timed to first successful request. Every MicroVM boots in 2 to 4.5 seconds regardless of what&apos;s inside, because the workload&apos;s startup is paid once at image build and snapshotted. Opencode on Cloudflare Containers takes 10.5 seconds at the median, and the worst boots push a minute.</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We benchmarked cold starts for AWS Lambda MicroVMs and
Cloudflare Containers: boot a fresh instance, wait until it
answers a real request, record the time, tear it down, repeat.
700 boots across 16 variants.&lt;/p&gt;
&lt;p&gt;The result, if latency is what matters to you: &lt;strong&gt;use AWS
MicroVMs for your sandboxes even if everything else you run is
on Cloudflare&lt;/strong&gt;. In this benchmark, booting a MicroVM &lt;em&gt;from a
Cloudflare Worker&lt;/em&gt; — cross-cloud, over the public AWS API — was
faster and far more predictable than Cloudflare’s own
containers on Cloudflare’s own platform. And with Alchemy’s
bindings, wiring a MicroVM into a Worker or Durable Object is a
few lines of code — we’ll show it below.&lt;/p&gt;
&lt;p&gt;We ran &lt;a href=&quot;https://opencode.ai&quot;&gt;opencode&lt;/a&gt; as one of the workloads
because it’s a popular coding agent that runs as a local
process, weighs about 100 MB, and has real startup latency —
exactly the kind of thing you’d host in a per-user sandbox. A
boot counts as ready when the server answers its health check
&lt;em&gt;and&lt;/em&gt; creates a real session. Here’s how the distributions
compare, opencode and hello world on both platforms:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/microvms/opencode-density.png&quot; alt=&quot;Time-to-usable-service distributions — the hello-world container peaks at 2 seconds, the MicroVM variants are tall narrow spikes at 3–4 seconds, and the opencode container is a wide hump at 10 seconds&quot;&gt;&lt;/p&gt;
&lt;p&gt;And the same data as individual boots — this view is what the
density curves smooth over, the container outliers at 20, 40,
nearly 60 seconds:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/microvms/opencode.png&quot; alt=&quot;Every boot — the container variants scatter out to 20, 40, nearly 60 seconds; the MicroVM variants never leave their cluster&quot;&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;p50&lt;/th&gt;
&lt;th&gt;p95&lt;/th&gt;
&lt;th&gt;max&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Container — opencode (via Worker)&lt;/td&gt;
&lt;td&gt;10.5s&lt;/td&gt;
&lt;td&gt;15.6s&lt;/td&gt;
&lt;td&gt;58.6s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM — opencode (via Lambda)&lt;/td&gt;
&lt;td&gt;3.4s&lt;/td&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;4.5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM — opencode (via Worker)&lt;/td&gt;
&lt;td&gt;3.6s&lt;/td&gt;
&lt;td&gt;4.0s&lt;/td&gt;
&lt;td&gt;4.2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Container — hello world (via Worker)&lt;/td&gt;
&lt;td&gt;1.7s&lt;/td&gt;
&lt;td&gt;23.9s&lt;/td&gt;
&lt;td&gt;47.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM — hello world (via Lambda)&lt;/td&gt;
&lt;td&gt;2.7s&lt;/td&gt;
&lt;td&gt;3.2s&lt;/td&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM — hello world (via Worker)&lt;/td&gt;
&lt;td&gt;3.1s&lt;/td&gt;
&lt;td&gt;3.8s&lt;/td&gt;
&lt;td&gt;5.4s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;What’s remarkable in that table is AWS’s consistency. Look at
the two workloads on MicroVMs: hello world is 2.7 seconds at
the median, opencode is 3.4. A 100 MB coding agent with real
startup work costs 0.7 seconds more than a 15-line server —
because on AWS, &lt;em&gt;everything&lt;/em&gt; goes through the same path. When
AWS builds a MicroVM image, it doesn’t just build the
Dockerfile — it &lt;strong&gt;runs the entrypoint, waits for the
application to initialize, and takes a Firecracker snapshot of
the running memory and disk&lt;/strong&gt;
(&lt;a href=&quot;https://aws.amazon.com/blogs/aws/run-isolated-sandboxes-with-full-lifecycle-control-aws-lambda-introduces-microvms/&quot;&gt;launch post&lt;/a&gt;).
Every &lt;code dir=&quot;auto&quot;&gt;RunMicrovm&lt;/code&gt; resumes from that snapshot, so the workload’s
startup is paid once, at build time. The flip side is that a
lighter image doesn’t boot faster — it goes through the same
snapshot restore. Boot time on AWS is a property of the
platform, not the workload: 2 to 4.5 seconds, whatever’s inside.&lt;/p&gt;
&lt;p&gt;Cloudflare is the opposite: boot time is a property of the
workload, plus a tail you can’t control. For small, light
containers that edge is real — the hello-world container is
ready in 1.7 seconds at the median, ahead of anything on AWS.
But a container cold start boots the image from scratch and
runs the entrypoint, so every single container pays opencode’s
full startup: the fastest opencode container in the run took
4.4 seconds and two-thirds took over 10. And the long tail has
nothing to do with the workload — the hello-world container
shows the same outliers in the scatter plot as the opencode
one, with about one boot in ten over 10 seconds and the worst
near 50. Yes, a Cloudflare container can be faster; it can also
be 30–40 seconds slower, and you can’t predict which you’ll get.&lt;/p&gt;
&lt;p&gt;For anything a person actually watches, AWS’s consistency is
the better trade. You never want a user staring at a spinner
for 10–60 seconds when they could wait 2–4.5, every time. A
predictable 3 seconds is something you can design an experience
around; an unpredictable 1-to-60 is not. Not one of the 49
successful opencode MicroVM boots exceeded 4.5 seconds.&lt;/p&gt;
&lt;p&gt;The “via Worker” MicroVM rows are the proof of the claim at the
top: those MicroVMs were booted &lt;strong&gt;from a Cloudflare Worker&lt;/strong&gt;,
and they beat Cloudflare’s own containers whenever the workload
is heavy enough that startup matters. Crossing clouds costs
nothing measurable — how that wiring works is covered below.&lt;/p&gt;
&lt;p&gt;The entire opencode image is this:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; public.ecr.aws/lambda/microvms:al2023-minimal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; curl -fsSL https://opencode.ai/install | bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WORKDIR&lt;/span&gt;&lt;span&gt; /workspace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ENTRYPOINT&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;opencode&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;serve&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;--hostname&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;--port&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;8080&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The snapshot behavior isn’t configured — it’s what building a
MicroVM image means.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-same-shape-without-the-workload&quot;&gt;The same shape without the workload&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Strip the workload away and the platforms keep the same
characters. These are the hello-world variants — a 15-line
&lt;code dir=&quot;auto&quot;&gt;Bun.serve&lt;/code&gt; on both platforms:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/microvms/every-boot.png&quot; alt=&quot;Every hello-world boot in the run — MicroVMs cluster between 2 and 4 seconds, containers scatter out past 45 seconds&quot;&gt;&lt;/p&gt;
&lt;p&gt;Cloudflare Containers are fast at the median — around 2
seconds — but the samples scatter out to 20, 40, nearly 50
seconds. AWS MicroVMs cluster between 2 and 4 seconds. The
distribution view makes the trade explicit:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/blog/microvms/cdf.png&quot; alt=&quot;CDF of time to usable service — container curves cross the MicroVM curves before the 90th percentile&quot;&gt;&lt;/p&gt;
&lt;p&gt;The container curves race ahead early and then go flat. Flat is
the problem: 73–90% of boots are done by 3 seconds, and then the
curve stalls — the remaining 10–27% of your users are waiting
10, 20, 40+ seconds. Every point in that flat stretch is a
person staring at a spinner.&lt;/p&gt;
&lt;p&gt;The MicroVM curves are the opposite shape: they start later but
go straight up. A vertical line means every boot takes the same
amount of time — the median user and the unluckiest user get
nearly the same experience. That’s the property you can build a
product on: you know what to promise, and the promise holds for
the last user as well as the first.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;p50&lt;/th&gt;
&lt;th&gt;p95&lt;/th&gt;
&lt;th&gt;max&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Container (plain Bun image)&lt;/td&gt;
&lt;td&gt;1.7s&lt;/td&gt;
&lt;td&gt;23.9s&lt;/td&gt;
&lt;td&gt;47.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Container (Effect image)&lt;/td&gt;
&lt;td&gt;2.3s&lt;/td&gt;
&lt;td&gt;24.0s&lt;/td&gt;
&lt;td&gt;46.7s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Container (public echo image)&lt;/td&gt;
&lt;td&gt;2.6s&lt;/td&gt;
&lt;td&gt;24.4s&lt;/td&gt;
&lt;td&gt;26.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM (plain Bun image)&lt;/td&gt;
&lt;td&gt;2.7s&lt;/td&gt;
&lt;td&gt;3.2s&lt;/td&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM (Effect image, Bun)&lt;/td&gt;
&lt;td&gt;2.9s&lt;/td&gt;
&lt;td&gt;4.4s&lt;/td&gt;
&lt;td&gt;4.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM (Effect image, Node)&lt;/td&gt;
&lt;td&gt;3.2s&lt;/td&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;td&gt;16.6s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS MicroVM (booted from a Cloudflare Worker)&lt;/td&gt;
&lt;td&gt;2.7s&lt;/td&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(The full 16-variant matrix — a Python image, the Node
baselines, the remaining Worker-driven rows — lives in the
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/tree/main/benchmark/container&quot;&gt;full report&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Which shape you want depends on what you’re building. If a slow
boot retries invisibly in the background, take the faster
median. If a person is watching — an agent sandbox spinning up,
a preview environment, a REPL — the tail is the experience, and
you can’t fix it with a spinner.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-we-timed&quot;&gt;What we timed&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;One metric: &lt;strong&gt;time to usable service&lt;/strong&gt;. Start the clock, ask the
platform for a new instance, and stop the clock at the first
successful application-level response. For the hello-world
variants that’s an RPC round-trip into the running program; for
opencode it’s the health check answering &lt;code dir=&quot;auto&quot;&gt;{&quot;healthy&quot;:true}&lt;/code&gt;
plus a &lt;code dir=&quot;auto&quot;&gt;POST /session&lt;/code&gt; returning a real session — a write
through the application, proving the resumed process actually
works, not merely that something is listening on the port.
Whatever the platform does in between (pull the image, allocate,
boot the kernel, start or restore the runtime, open the port) is
inside the measurement, because it’s inside the user’s wait.&lt;/p&gt;
&lt;p&gt;Every sample is a genuine cold start: each boot uses a fresh
instance and the instance is terminated before the next round.
One untimed warm-up boot runs first, so the one-time cost of
distributing a freshly pushed image isn’t mixed into the numbers.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-images-under-test&quot;&gt;The images under test&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The benchmark is an ordinary Alchemy app
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/tree/main/benchmark/container&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;benchmark/container&lt;/code&gt;&lt;/a&gt;).
Each variant is an image resource, and the variants are chosen
to isolate one question each.&lt;/p&gt;
&lt;p&gt;The plain-Bun baseline answers “how fast can this platform
possibly boot a JS server?” It’s a Dockerfile and a
15-line &lt;code dir=&quot;auto&quot;&gt;Bun.serve&lt;/code&gt; script:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; public.ecr.aws/lambda/microvms:al2023-minimal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; curl -fsSL https://bun.sh/install | bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WORKDIR&lt;/span&gt;&lt;span&gt; /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;COPY&lt;/span&gt;&lt;span&gt; server.js .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ENTRYPOINT&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;bun&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;/app/server.js&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The Effect image answers “what does Alchemy’s abstraction cost
on top of that?” Instead of a Dockerfile and a server script,
you write an Effect program and Alchemy bundles it into the
image — the class is the infrastructure declaration &lt;em&gt;and&lt;/em&gt; the
typed client:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MicrovmImage&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;string&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;MicrovmEffectfulBun&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; runtime&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bun&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ok&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (message) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`hello, ${&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;}!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Deploying that builds a MicroVM image whose entrypoint is the
bundled program. Anything that binds &lt;code dir=&quot;auto&quot;&gt;EffectfulBun&lt;/code&gt; gets
&lt;code dir=&quot;auto&quot;&gt;hello&lt;/code&gt; as a typed method — the RPC plumbing, auth headers, and
serialization are generated.&lt;/p&gt;
&lt;p&gt;The gap between the two rows in the table is the entire cost of
that abstraction: &lt;strong&gt;0.2 seconds&lt;/strong&gt; at the median (2.9s vs 2.7s),
and it buys you typed RPC, bindings, and no Dockerfile. We ran
the same pair on Node (the MicroVM base image ships with it) and
the gap there is a rounding error.&lt;/p&gt;
&lt;p&gt;The Cloudflare side mirrors this exactly — a plain &lt;code dir=&quot;auto&quot;&gt;oven/bun&lt;/code&gt;
container, the same Effect program as a
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Container&lt;/code&gt;, and a public echo image pulled from
Docker Hub as a third reference point. Same story on that side
too: the Effect image costs nothing measurable; the tail is a
property of the platform, not the image.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;booting-a-microvm-from-a-cloudflare-worker&quot;&gt;Booting a MicroVM from a Cloudflare Worker&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is the part that makes “use AWS MicroVMs from Cloudflare”
practical rather than theoretical. Here’s the entire Worker
from the benchmark — the binding calls are the same ones a
Lambda would make:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;MicrovmBenchWorker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RunMicrovm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CreateAuthToken&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;terminate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TerminateMicrovm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;({})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;authToken&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;auth&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;microvmIdentifier&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;.microvmId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expirationInMinutes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedPorts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8080&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;connectMicrovm&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;EffectfulBun&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;endpoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;.endpoint&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;authToken&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;bench&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;terminate&lt;/span&gt;&lt;span&gt;({ microvmIdentifier&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vm&lt;/span&gt;&lt;span&gt;.microvmId })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;There’s no AWS account configuration in that file. The binding
detects what it’s attached to. On a Lambda host,
&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.RunMicrovm(EffectfulBun)&lt;/code&gt; adds &lt;code dir=&quot;auto&quot;&gt;lambda:RunMicrovm&lt;/code&gt;
on that image’s ARN to the function’s execution role, and the
runtime uses the assumed IAM Role credentials already available
in the Lambda Function’s environment.&lt;/p&gt;
&lt;p&gt;On a Worker host there is no execution role, so the binding
builds the bridge itself. At deploy time it creates, once per
Worker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an IAM &lt;strong&gt;User&lt;/strong&gt; whose only permission is &lt;code dir=&quot;auto&quot;&gt;sts:AssumeRole&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;AccessKey&lt;/strong&gt; for that user, bound into the Worker as a
secret,&lt;/li&gt;
&lt;li&gt;an IAM &lt;strong&gt;Role&lt;/strong&gt; that trusts only that user — and this is the
role every MicroVM permission accumulates on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At runtime the Worker uses the access key for exactly one
operation: &lt;code dir=&quot;auto&quot;&gt;AssumeRole&lt;/code&gt;. Everything else — &lt;code dir=&quot;auto&quot;&gt;RunMicrovm&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;CreateAuthToken&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;TerminateMicrovm&lt;/code&gt; — is signed with the
short-lived session credentials that come back. Those are cached
and refreshed near expiry, shared across every binding on the
Worker, so the STS call happens once per isolate rather than
once per request.&lt;/p&gt;
&lt;p&gt;Ideally the User wouldn’t exist at all — OIDC federation from
the Worker straight into the Role would remove the long-lived
key entirely, and that’s where we want to take this. But the
shape is already the right one: the static credential can do
nothing except mint short-lived ones, and the permissions live
on a role scoped to the specific images the Worker binds.&lt;/p&gt;
&lt;p&gt;The benchmark says the bridge is free: Worker → MicroVM lands
within noise of Lambda → MicroVM on every variant. An
&lt;code dir=&quot;auto&quot;&gt;AssumeRole&lt;/code&gt; amortized across boots doesn’t show up.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-the-benchmark-runs&quot;&gt;How the benchmark runs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A few methodology details matter more than usual here, because
getting them wrong changed our conclusions the first time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MicroVM boots run one at a time.&lt;/strong&gt; The MicroVM control plane
is rate-limited per account —
&lt;a href=&quot;https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#microvms-quotas&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;RunMicrovm&lt;/code&gt; allows 5 TPS with a burst of 5&lt;/a&gt;.
An early version of this benchmark launched 5 at once, sat
exactly on that ceiling, and measured API throttling mixed into
boot time — it looked like MicroVMs had a 1–2 second tail they
don’t have. Each MicroVM sample is now a fully isolated
launch → ready → terminate with nothing else in flight.
Containers have no comparable per-boot limit, so they’re
measured under concurrent load (10 rounds × 10 simultaneous
boots).&lt;/p&gt;
&lt;p&gt;This is also why we didn’t compare 100 simultaneous MicroVM
launches: the 5 TPS is a soft limit, raised by request. It’s
the standard AWS pattern of putting friction on access to a
resource rather than a hard capacity ceiling — they’ll bump it
when you ask, so it says nothing about how fast the platform
boots VMs, only how fast a fresh account is allowed to ask.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The driver measures inside the host.&lt;/strong&gt; Each host (the Lambda
orchestrator, the Worker) exposes a &lt;code dir=&quot;auto&quot;&gt;/boot&lt;/code&gt; route that starts
the clock, launches the instance, polls until a real request
succeeds, and reports &lt;code dir=&quot;auto&quot;&gt;readyMs&lt;/code&gt;. The external driver only
orchestrates; network latency to the driver never contaminates
the measurement. On the container side the clock wraps the
entire Durable Object call — instance allocation, container
start, and the readiness probe — so nothing that happens before
the probe can leak out of the measurement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resources are matched or tilted against the winner.&lt;/strong&gt; The
opencode container runs on Cloudflare’s &lt;code dir=&quot;auto&quot;&gt;standard-1&lt;/code&gt; instance
type (4 GiB) against the MicroVM’s 1 GiB, so the gap isn’t
resource starvation — it’s the snapshot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everything is written down.&lt;/strong&gt; Every boot lands as a row in a
CSV, and the summary table and plots are generated from it. The
app, the driver, and the data are in the repo — change a
variant, run &lt;code dir=&quot;auto&quot;&gt;bun bench&lt;/code&gt;, and see for yourself.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;where-this-lands&quot;&gt;Where this lands&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare Containers win the median for tiny images. AWS
MicroVMs win everything else: the worst case by an order of
magnitude, and the median too once the workload is heavy enough
that startup matters. For anything where a person watches the
boot — an agent sandbox, a preview environment, a REPL — the
consistency is the feature. A user who always waits 3 seconds
is happy; a user who sometimes waits 45 is gone.&lt;/p&gt;
&lt;p&gt;One real advantage on Cloudflare’s side that latency numbers
don’t capture: the Durable Object sits in front of &lt;em&gt;all&lt;/em&gt; of the
container’s network traffic. Your JavaScript can intercept
every HTTP request the container makes — effectively a
man-in-the-middle proxy you control. That enables patterns
MicroVMs can’t do natively: keep API credentials in the Worker
and inject them into outbound requests, so the agent running
inside the container never sees a key it could leak. If your
sandbox runs untrusted or agent-generated code against
credentialed APIs, that interception layer is a serious reason
to choose Cloudflare Containers despite the boot-time tail.&lt;/p&gt;
&lt;p&gt;Both platforms sit behind the same abstraction: the same Effect
program deploys as a Cloudflare Container or an AWS MicroVM,
the same binding call works from a Lambda or a Worker, and the
cross-cloud IAM wiring is generated from the code that uses it.
Picking the latency shape you want is a couple of lines.&lt;/p&gt;
</content:encoded></item><item><title>2.0.0-beta.59 - One Namespace, One Binding</title><link>https://alchemy.run/blog/2026-06-27-beta-59/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-06-27-beta-59/</guid><description>v2.0.0-beta.59 is a naming alignment release. Every Cloudflare service is now a proper namespace, every binding follows one {Verb}{Resource} convention across AWS and Cloudflare, and Binding.Policy is gone — collapsed into a single runtime-guarded Layer.</description><pubDate>Sat, 27 Jun 2026 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.59 is the alignment release beta.58 set up. It is
almost entirely renames: every Cloudflare service is now a real
namespace, every binding across AWS &lt;strong&gt;and&lt;/strong&gt; Cloudflare follows one
&lt;code dir=&quot;auto&quot;&gt;{Verb}{Resource}&lt;/code&gt; convention, and the two-layer &lt;code dir=&quot;auto&quot;&gt;Binding.Policy&lt;/code&gt;
split is gone — folded into a single runtime-guarded &lt;code dir=&quot;auto&quot;&gt;Layer&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/690&quot;&gt;#690&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;There’s almost no new behavior here. It’s a coordinated rename across
~900 symbols and ~1200 files so the API reads the same everywhere —
you’ll find-and-replace your way through it.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt; — this release is mostly breaking renames.
Migration for each is below.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every Cloudflare service is namespaced&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Cloudflare.KVNamespace&lt;/code&gt;
→ &lt;code dir=&quot;auto&quot;&gt;Cloudflare.KV.Namespace&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workers.Worker&lt;/code&gt; (common ones are re-exported at the root).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AiGateway&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;AiSearch&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;AiSecurity&lt;/code&gt; collapse into &lt;code dir=&quot;auto&quot;&gt;AI&lt;/code&gt;&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.AiGateway&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Cloudflare.AI.Gateway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bindings are now directly callable, namespaced, and
least-privilege&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;R2Bucket.bind(b)&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.ReadBucket(b)&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;DynamoDB.GetItem.bind(t)&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;AWS.DynamoDB.GetItem(t)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Binding.Policy&lt;/code&gt; is removed&lt;/strong&gt; — the deploy-time wiring moves behind
an &lt;code dir=&quot;auto&quot;&gt;if (!globalThis.__ALCHEMY_RUNTIME__)&lt;/code&gt; guard in a single Layer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impl layers are renamed&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;*Live&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt; (Cloudflare native
worker binding) or &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; (HTTP-client binding, all AWS + the
Cloudflare HTTP impls).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event sources are &lt;code dir=&quot;auto&quot;&gt;consume&amp;#x3C;Resource&gt;&amp;#x3C;Event&gt;(resource, handler)&lt;/code&gt;&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;Queues.messages(q).subscribe(fn)&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Queues.consumeQueueMessages(q, fn)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker-only bindings take a string id&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Images({ name: &quot;X&quot; })&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;Images(&quot;X&quot;)&lt;/code&gt;; their native layers drop &lt;code dir=&quot;auto&quot;&gt;*Live&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;*Layer&lt;/code&gt;
(&lt;code dir=&quot;auto&quot;&gt;BrowserBindingLive&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;BrowserBinding&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Artifacts.Store&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Artifacts.Namespace&lt;/code&gt;&lt;/strong&gt; — and &lt;code dir=&quot;auto&quot;&gt;ReadWriteStore&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;ReadWriteNamespace&lt;/code&gt; (plus &lt;code dir=&quot;auto&quot;&gt;Read*&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Write*&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;every-cloudflare-service-is-a-namespace&quot;&gt;Every Cloudflare service is a namespace&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare/index.ts&lt;/code&gt; used to be a flat &lt;code dir=&quot;auto&quot;&gt;export *&lt;/code&gt; of every symbol, so
everything lived directly on &lt;code dir=&quot;auto&quot;&gt;Cloudflare.*&lt;/code&gt; with a redundant prefix
baked into each name (&lt;code dir=&quot;auto&quot;&gt;Cloudflare.KVNamespace&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2Bucket&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.D1Database&lt;/code&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;resources-move-under-their-service&quot;&gt;Resources move under their service&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;It now mirrors the AWS standard — one &lt;code dir=&quot;auto&quot;&gt;export * as &amp;#x3C;Service&gt;&lt;/code&gt; per
service, with the prefix stripped from the symbol:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KVNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sessions&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Assets&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;App&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Namespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sessions&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Assets&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;D1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;App&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The same applies to &lt;code dir=&quot;auto&quot;&gt;Worker&lt;/code&gt;, which now lives under &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workers&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;common-building-blocks-stay-at-the-root&quot;&gt;Common building blocks stay at the root&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The common building blocks are re-exported at the root so the everyday
path stays short — these all still resolve, no namespace required:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Sandbox&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workflow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Job&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RateLimit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Limiter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cron&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;0 * * * *&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; handler)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Everything else is reached through its namespace.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;durableobjectnamespace--durableobject&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;DurableObjectNamespace&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;DurableObject&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Durable Object base class loses its &lt;code dir=&quot;auto&quot;&gt;Namespace&lt;/code&gt; suffix — it’s a
&lt;code dir=&quot;auto&quot;&gt;DurableObject&lt;/code&gt; now, full stop:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectNamespace&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObject&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Counter&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Counter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;folder-reshuffles-and-the-new-websocket-type&quot;&gt;Folder reshuffles and the new &lt;code dir=&quot;auto&quot;&gt;WebSocket&lt;/code&gt; type&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A few folders were reshaped to fit: &lt;code dir=&quot;auto&quot;&gt;Container/&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Containers/&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Queue&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Queues&lt;/code&gt;, and workflow code moved into &lt;code dir=&quot;auto&quot;&gt;Workflows/&lt;/code&gt;. There’s
also a new &lt;code dir=&quot;auto&quot;&gt;Cloudflare.WebSocket&lt;/code&gt; &lt;strong&gt;type&lt;/strong&gt; for typing hibernatable
WebSocket handlers.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ai-becomes-one-ai-namespace&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Ai*&lt;/code&gt; becomes one &lt;code dir=&quot;auto&quot;&gt;AI&lt;/code&gt; namespace&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The three separate AI services — &lt;code dir=&quot;auto&quot;&gt;AiGateway&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AiSearch&lt;/code&gt;, and
&lt;code dir=&quot;auto&quot;&gt;AiSecurity&lt;/code&gt; — were really one product surface split across three
folders. They collapse into a single &lt;code dir=&quot;auto&quot;&gt;Cloudflare.AI&lt;/code&gt; namespace:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiGateway&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Gateway&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiSearch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Search&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Gateway&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Gateway&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AI&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Search&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Search&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Symbols drop the redundant &lt;code dir=&quot;auto&quot;&gt;Ai&lt;/code&gt; prefix in the process —
&lt;code dir=&quot;auto&quot;&gt;AiGatewayDataset&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;AI.Dataset&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AiSearchInstance&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;AI.SearchInstance&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AiSecuritySettings&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;AI.SecuritySettings&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;one-binding-convention-everywhere&quot;&gt;One binding convention, everywhere&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is the heart of the release. AWS and Cloudflare bindings now read
identically. A capability is the noun, prefixed by the verb (the
access level it grants), and you call it &lt;strong&gt;directly&lt;/strong&gt; — the &lt;code dir=&quot;auto&quot;&gt;.bind&lt;/code&gt;
method is gone:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetItem&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2Bucket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamoDB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;GetItem&lt;/span&gt;&lt;span&gt;(table)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Where the underlying API distinguishes access levels, the capability is
split into &lt;code dir=&quot;auto&quot;&gt;Read&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Write&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;ReadWrite&lt;/code&gt; so you request least
privilege — and the verb leads the name:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sessions&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// get / list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sessions&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// put / delete&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KV&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sessions&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// both&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;binding-vs-http&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt; vs &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each capability ships two interchangeable implementation Layers, and
the suffix tells you which transport it uses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt;&lt;/strong&gt; — a native &lt;strong&gt;Cloudflare Worker binding&lt;/strong&gt; (&lt;code dir=&quot;auto&quot;&gt;env.BUCKET&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;&lt;/strong&gt; — a &lt;strong&gt;scoped HTTP client&lt;/strong&gt; that works anywhere, including
inside a Container process that has no native binding.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// native Worker binding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// scoped HTTP token — same client, runs anywhere&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The split lands on AWS too, where the only transport is HTTP: every AWS
impl layer was renamed &lt;code dir=&quot;auto&quot;&gt;*Live&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;DynamoDB.GetItemHttp&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;SQS.SendMessageHttp&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;S3.GetObjectHttp&lt;/code&gt;), because an AWS runtime calls
the distilled HTTP API authenticated by the Lambda’s IAM role.
&lt;code dir=&quot;auto&quot;&gt;Binding&lt;/code&gt; is a Cloudflare native-worker concept — AWS never had one.&lt;/p&gt;
&lt;p&gt;The two transports do the same thing in their respective worlds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AWS &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;&lt;/strong&gt; — emits a least-privilege &lt;strong&gt;IAM policy statement&lt;/strong&gt; on
the Lambda’s role, then calls the distilled HTTP API with it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;&lt;/strong&gt; — mints a scoped &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AccountApiToken&lt;/code&gt;&lt;/strong&gt; with
only the permission groups that access level needs, binds the token’s
value into the environment as a secret, and calls Cloudflare’s REST
API through distilled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The client interface is &lt;strong&gt;identical&lt;/strong&gt; regardless of which Layer you
provide — a Worker reading a bucket over its native binding and a
container reading the same bucket over a token are the same code.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;more-cloudflare-http-bindings-one-mechanism&quot;&gt;More Cloudflare &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; bindings, one mechanism&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A native Worker binding only exists inside a Worker. The moment you
need the same capability somewhere with no native binding — a Container
process, a Durable Object reaching a foreign resource, a script running
outside the edge — you need the HTTP transport. beta.59 fills that
gap out: R2, KV, and Queues already had &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; impls, and DNS joins
them this release, all sharing one mechanism and the verb-first naming.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadDns&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Zone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// list / get records&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteDns&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Zone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// create / update / delete&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteDns&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Zone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// both&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;how-it-works-mint-a-scoped-accountapitoken&quot;&gt;How it works: mint a scoped &lt;code dir=&quot;auto&quot;&gt;AccountApiToken&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;An &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; Layer can’t lean on &lt;code dir=&quot;auto&quot;&gt;env.MY_BINDING&lt;/code&gt;, so it provisions its
own credential. At deploy time it mints an &lt;code dir=&quot;auto&quot;&gt;AccountApiToken&lt;/code&gt; scoped to
&lt;strong&gt;only&lt;/strong&gt; the permission groups that access level needs, and binds that
token’s value into the host as a secret — all behind the
&lt;code dir=&quot;auto&quot;&gt;__ALCHEMY_RUNTIME__&lt;/code&gt; guard so it’s a deploy-time-only step:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AccountApiToken&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LogicalId&lt;/span&gt;&lt;span&gt;}Token`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;globalThis&lt;/span&gt;&lt;span&gt;.__ALCHEMY_RUNTIME__) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LogicalId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;policies&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;effect&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;allow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;permissionGroups&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// e.g. [&quot;Workers KV Storage Read&quot;] for ReadNamespace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resources&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { [&lt;/span&gt;&lt;span&gt;`com.cloudflare.api.account.${&lt;/span&gt;&lt;span&gt;accountId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The permission groups are what make this least-privilege: a
&lt;code dir=&quot;auto&quot;&gt;ReadNamespace&lt;/code&gt; mints a read-only KV token, a &lt;code dir=&quot;auto&quot;&gt;WriteNamespace&lt;/code&gt; a
write-only one. At runtime the client reads the token’s &lt;code dir=&quot;auto&quot;&gt;value&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;accountId&lt;/code&gt; from its secrets and calls Cloudflare’s REST API through
distilled — no account-wide API key, no manual token plumbing, and a
different scoped token per capability.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bindingpolicy-is-gone&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Binding.Policy&lt;/code&gt; is gone&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Bindings used to be two pieces: a runtime &lt;code dir=&quot;auto&quot;&gt;Binding.Service&lt;/code&gt; plus a
separate deploy-time &lt;code dir=&quot;auto&quot;&gt;Binding.Policy&lt;/code&gt; (with its own &lt;code dir=&quot;auto&quot;&gt;*PolicyLive&lt;/code&gt;
layer) that registered the IAM / native binding. beta.59 collapses them
into a single &lt;code dir=&quot;auto&quot;&gt;Binding.Service&lt;/code&gt; whose setup Effect does the deploy-time
wiring inline, guarded so it only runs at plan time:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;globalThis&lt;/span&gt;&lt;span&gt;.__ALCHEMY_RUNTIME__) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// deploy-time only: register IAM / native binding / env on the host&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;resource&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/* … */&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// always: return the typed runtime client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;At plan time the guard is open and &lt;code dir=&quot;auto&quot;&gt;bind&lt;/code&gt; records what the function
needs. At runtime (&lt;code dir=&quot;auto&quot;&gt;__ALCHEMY_RUNTIME__&lt;/code&gt; is set) the branch is skipped
and the same call resolves to just the lightweight client, so the
runtime bundle stays small. This is the exact pattern the capability
bindings already used in beta.58 — now &lt;strong&gt;every&lt;/strong&gt; binding, including
event sources, follows it. &lt;code dir=&quot;auto&quot;&gt;Binding.Policy&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Binding.ServiceClass&lt;/code&gt;,
and the &lt;code dir=&quot;auto&quot;&gt;Policy&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;PolicyLike&lt;/code&gt; types are removed from the core.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;worker-only-bindings-take-a-string-id&quot;&gt;Worker-only bindings take a string id&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Cloudflare bindings with no backing resource — &lt;code dir=&quot;auto&quot;&gt;Images&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Browser&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;VersionMetadata&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;RateLimit&lt;/code&gt; — now take a &lt;strong&gt;string id first&lt;/strong&gt;, like a
resource logical id, instead of a &lt;code dir=&quot;auto&quot;&gt;{ name }&lt;/code&gt; object:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;({ name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;PIPELINE&quot;&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Images&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PIPELINE&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Their native layers drop the &lt;code dir=&quot;auto&quot;&gt;*Live&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;*Layer&lt;/code&gt; suffix to match the
&lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt; convention:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BrowserBindingLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Workers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BrowserBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;artifactsstore--artifactsnamespace&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Artifacts.Store&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Artifacts.Namespace&lt;/code&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Artifacts namespace is renamed &lt;code dir=&quot;auto&quot;&gt;Store&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Namespace&lt;/code&gt;. Access stays
explicit through &lt;code dir=&quot;auto&quot;&gt;ReadNamespace&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;WriteNamespace&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;ReadWriteNamespace&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Repos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Artifacts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Store&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Repos&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Artifacts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteStore&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Repos&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Repos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Artifacts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Namespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Repos&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Artifacts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Repos&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;event-sources-consumeresourceevent&quot;&gt;Event sources: &lt;code dir=&quot;auto&quot;&gt;consume&amp;#x3C;Resource&gt;&amp;#x3C;Event&gt;&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Event sources are bindings too, so they got the same treatment. The old
&lt;code dir=&quot;auto&quot;&gt;X(resource, props?).subscribe(handler)&lt;/code&gt; shape is replaced by a single
verb-prefixed, resource-and-event-named callable that takes the handler
as its last argument:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;(inbound).&lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt;((records) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;records&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runForEach&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;&lt;span&gt;.log))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Queues&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeQueueMessages&lt;/span&gt;&lt;span&gt;(inbound&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (records) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;records&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runForEach&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;&lt;span&gt;.log))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Every event source now reads the same way — the name tells you both the
resource and the element it yields:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;SQS.messages(q).subscribe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;SQS.consumeQueueMessages(q, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;S3.notifications(b).subscribe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;S3.consumeBucketEvents(b, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;SNS.notifications(t).subscribe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;SNS.consumeTopicNotifications(t, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Kinesis.records(s).process&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Kinesis.consumeStreamRecords(s, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;DynamoDB.stream(t).process&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;DynamoDB.consumeTableChanges(t, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;GitHub.events(r).subscribe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;GitHub.consumeRepositoryEvents(r, fn)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dropping &lt;code dir=&quot;auto&quot;&gt;.subscribe&lt;/code&gt; also drops the handler’s runtime requirements at
the source boundary, so explicit &lt;code dir=&quot;auto&quot;&gt;Body&lt;/code&gt; type arguments no longer break
inference.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Two fixes shipped alongside the rename:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;deleteFirst&lt;/code&gt; is honored on replace&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/692&quot;&gt;#692&lt;/a&gt;) — a
replacement defaults to create-first (stand up the new generation,
then tear down the old), but some resources can’t coexist with their
previous self (a fixed physical name, a singleton). &lt;code dir=&quot;auto&quot;&gt;deleteFirst&lt;/code&gt; is
meant to flip that ordering, and the engine now actually does: it
deletes the previous generation &lt;strong&gt;before&lt;/strong&gt; creating the replacement
instead of leaking an old chain into the next phase. Thanks
&lt;strong&gt;John Royal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Worker diff tolerates legacy custom-domain state&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/694&quot;&gt;#694&lt;/a&gt;) —
Alchemy ≤ beta.44 stored each Worker custom domain as a
&lt;code dir=&quot;auto&quot;&gt;{ id, hostname, zoneId }&lt;/code&gt; object; beta.45+ stores
&lt;code dir=&quot;auto&quot;&gt;https://&amp;#x3C;hostname&gt;&lt;/code&gt; strings and the diff path calls string methods
on each entry. Older state now gets coerced back to strings so a
Worker deploy no longer throws &lt;code dir=&quot;auto&quot;&gt;u.endsWith is not a function&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/issues/546&quot;&gt;#546&lt;/a&gt;).
Thanks &lt;strong&gt;Nicolas Fléron&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Binding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/phases#the-__alchemy_runtime__-guard&quot;&gt;Plantime and Runtime › The &lt;code dir=&quot;auto&quot;&gt;__ALCHEMY_RUNTIME__&lt;/code&gt; guard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/messaging/queues&quot;&gt;Queue Consumer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta59&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.58...v2.0.0-beta.59&quot;&gt;Compare v2.0.0-beta.58 → v2.0.0-beta.59&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.58 - Platform Ergonomics</title><link>https://alchemy.run/blog/2026-06-24-beta-58/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-06-24-beta-58/</guid><description>v2.0.0-beta.58 improves the ergonomics of Layers that contain Resources, so you can bundle infrastructure into a reusable service — like an agent tool — and provide it to a Worker, Container, or Durable Object.</description><pubDate>Wed, 24 Jun 2026 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.58 improves the ergonomics of Layers that contain Resources, so
you can bundle infrastructure into a reusable service — like an agent
tool — and provide it to a Worker, Container, or Durable Object.&lt;/p&gt;
&lt;p&gt;A few changes get us there. First, a Platform tag (e.g. a Worker or
Container) becomes &lt;strong&gt;pure identity&lt;/strong&gt;: its props and its runtime
implementation move out of the tag and into a Layer.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkerB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;WorkerB&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;WorkerB&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// props on the tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkerB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;WorkerB&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;WorkerB&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WorkerB&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// props on the Layer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Also, &lt;code dir=&quot;auto&quot;&gt;DurableObjectState&lt;/code&gt; can now be yielded at the top level,
instead of having to be resolved inside the nested &lt;code dir=&quot;auto&quot;&gt;Effect.gen&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectState&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectState&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&amp;#x3C;number&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;count&quot;&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Initialization is where resources, bindings, and dependencies are
declared, so a Layer can contain infrastructure and be provided to any
Worker, Durable Object, or Container without changing its shape.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Breaking changes&lt;/strong&gt; — migration for each is below.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Props move from the tag to &lt;code dir=&quot;auto&quot;&gt;.make()&lt;/code&gt;&lt;/strong&gt; on the Layer form of
&lt;code dir=&quot;auto&quot;&gt;Worker&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;DurableObjectState&lt;/code&gt;&lt;/strong&gt; is resolved in the &lt;strong&gt;outer&lt;/strong&gt; init Effect.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containers&lt;/strong&gt; replace &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Container.bind&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.start&lt;/code&gt; with &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt;-the-class + &lt;code dir=&quot;auto&quot;&gt;Cloudflare.layerContainer&lt;/code&gt;,
and &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt;-ing the tag now returns a &lt;strong&gt;running container&lt;/strong&gt;, not the
&lt;code dir=&quot;auto&quot;&gt;ContainerApplication&lt;/code&gt; resource.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource bindings&lt;/strong&gt; replace a resource’s single &lt;code dir=&quot;auto&quot;&gt;.bind&lt;/code&gt; with
namespaced, least-privilege capabilities (&lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.ReadWriteBucket&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code dir=&quot;auto&quot;&gt;Build&lt;/code&gt; module is removed&lt;/strong&gt; in favor of a new &lt;code dir=&quot;auto&quot;&gt;Command&lt;/code&gt;
module (&lt;code dir=&quot;auto&quot;&gt;Build.Command&lt;/code&gt; → &lt;code dir=&quot;auto&quot;&gt;Command.Build&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Build.DevServer&lt;/code&gt; →
&lt;code dir=&quot;auto&quot;&gt;Command.Dev&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;DynamicWorkerLoader&lt;/code&gt; is renamed&lt;/strong&gt; to &lt;code dir=&quot;auto&quot;&gt;WorkerLoader&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;one-tag-many-implementations&quot;&gt;One tag, many implementations&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Because the tag is pure identity, one tag can have &lt;strong&gt;many&lt;/strong&gt;
implementations. &lt;code dir=&quot;auto&quot;&gt;.make(propsA, implA)&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.make(propsB, implB)&lt;/code&gt;
produce two Layers for the same tag — swap a real implementation for
a stub in tests, or vary config per stage:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxProd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; instanceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;standard-1&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;realImpl&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxTest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; instanceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dev&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fakeImpl&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The inline form is unchanged — pass the implementation as a third
argument and props stay inline:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Worker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// still inline here&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;a-tool-on-durable-object-storage&quot;&gt;A tool on Durable Object storage&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Resolving &lt;code dir=&quot;auto&quot;&gt;DurableObjectState&lt;/code&gt; at init is what lets you capture the
DO’s storage in a &lt;strong&gt;Layer&lt;/strong&gt; and expose it as a service — the shape a
&lt;code dir=&quot;auto&quot;&gt;Sql&lt;/code&gt; tool takes. Resolve &lt;code dir=&quot;auto&quot;&gt;state&lt;/code&gt; (and anything else, like an R2
bucket) at init, return the runtime methods:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Archive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Archive&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;void&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; never&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RuntimeContext&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// &amp;#x3C;- RuntimeContext-colored&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Archive&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ArchiveLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;effect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Archive&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Resolve both references at init.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectState&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Archive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// The body runs at runtime — both calls are RuntimeContext-colored.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (key&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; body) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;put&lt;/span&gt;&lt;span&gt;(key&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; body)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;storage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;put&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`saved:${&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Provide &lt;code dir=&quot;auto&quot;&gt;ArchiveLive&lt;/code&gt; on the DO’s init and &lt;code dir=&quot;auto&quot;&gt;yield* Archive&lt;/code&gt; from the
inner Effect:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Doc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectNamespace&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Doc&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Doc&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;archive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Archive&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// resolved at init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;archive&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt;(key&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; body)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ArchiveLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Neither &lt;code dir=&quot;auto&quot;&gt;DurableObjectState&lt;/code&gt; nor R2 leaks into &lt;code dir=&quot;auto&quot;&gt;Archive&lt;/code&gt;’s public
type — consumers see only &lt;code dir=&quot;auto&quot;&gt;RuntimeContext&lt;/code&gt;, so the service stays
cloud-agnostic.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;a-tool-on-a-running-container&quot;&gt;A tool on a running Container&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Containers used to be a three-step dance — &lt;code dir=&quot;auto&quot;&gt;bind&lt;/code&gt;, then &lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt;, then
use. beta.58 collapses that: &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt; the Container tag to get the
&lt;strong&gt;running container instance&lt;/strong&gt; (not the &lt;code dir=&quot;auto&quot;&gt;ContainerApplication&lt;/code&gt;
resource), and provide &lt;code dir=&quot;auto&quot;&gt;Cloudflare.layerContainer(Class, options)&lt;/code&gt; to
configure how it runs.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;(sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enableInternet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (cmd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(cmd)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (cmd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(cmd)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layerContainer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { enableInternet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;layerContainer&lt;/code&gt; binds, starts, and monitors the container, then
satisfies the &lt;code dir=&quot;auto&quot;&gt;Sandbox&lt;/code&gt; tag with the running instance. Because it’s a
plain &lt;code dir=&quot;auto&quot;&gt;Layer&lt;/code&gt;, &lt;strong&gt;any&lt;/strong&gt; Effect or Layer can &lt;code dir=&quot;auto&quot;&gt;yield* Sandbox&lt;/code&gt; and get a
running container — so a &lt;code dir=&quot;auto&quot;&gt;Bash&lt;/code&gt; tool is just a Layer that captures the
container and shells out to it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;effect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;BashTool&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// running instance&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BashTool&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (cmd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt;(cmd)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;Bash&lt;/code&gt; Layer just &lt;em&gt;requires&lt;/em&gt; &lt;code dir=&quot;auto&quot;&gt;Sandbox&lt;/code&gt; — &lt;code dir=&quot;auto&quot;&gt;layerContainer&lt;/code&gt; is
provided once on the host’s outermost init Effect, where it satisfies
both &lt;code dir=&quot;auto&quot;&gt;Bash&lt;/code&gt; and anything else that needs the container:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Layer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provideMerge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layerContainer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Sandbox&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;External and remote &lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt; images (built from a &lt;code dir=&quot;auto&quot;&gt;context&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;dockerfile&lt;/code&gt;, or pulled from a registry) have no runtime shape and no
&lt;code dir=&quot;auto&quot;&gt;.make()&lt;/code&gt; — declare their props inline on the tag and register them
with &lt;code dir=&quot;auto&quot;&gt;Cloudflare.layerContainer&lt;/code&gt; from the hosting Durable Object.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rpc-works-in-containers&quot;&gt;RPC works in Containers&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Container RPC always existed on paper, but was never properly
implemented or tested. As of beta.58 it actually works. A &lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt;
declares a typed runtime shape just like a Worker or Durable Object,
and those methods are callable over &lt;strong&gt;RPC&lt;/strong&gt; — the container exposes
Effect-returning methods alongside its &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; handler:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;string&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;readObject&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;&amp;#x3C;string &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; never&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RuntimeContext&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;MyContainer&quot;&lt;/span&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dockerfile&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;FROM oven/bun:latest&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Storage&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; () &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;pong&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;readObject&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (key) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;/* ... */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;From the host, &lt;code dir=&quot;auto&quot;&gt;yield* MyContainer&lt;/code&gt; gives the running container and
its methods round-trip through Cloudflare’s RPC machinery as typed
Effects — no &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; plumbing, no manual serialization:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyContainer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pong&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;// RPC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;readObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;key&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// RPC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code dir=&quot;auto&quot;&gt;container.getTcpPort(port)&lt;/code&gt; when you do need a raw &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; into a
server running inside the container process.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workerloader&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;WorkerLoader&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;DynamicWorkerLoader&lt;/code&gt; is renamed to &lt;code dir=&quot;auto&quot;&gt;WorkerLoader&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;load(...)&lt;/code&gt;
now returns an Effect, so you &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt; it
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/653&quot;&gt;#653&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DynamicWorkerLoader&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Loader&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;({ compatibilityDate&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; mainModule&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; modules })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WorkerLoader&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Loader&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;worker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loader&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;({ compatibilityDate&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; mainModule&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; modules })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;bindings-least-privilege-native-or-http&quot;&gt;Bindings: least-privilege, native or HTTP&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Bindings move to a &lt;strong&gt;namespaced convention&lt;/strong&gt;: the single &lt;code dir=&quot;auto&quot;&gt;.bind&lt;/code&gt; on a
resource is gone, replaced by a capability namespaced per &lt;strong&gt;access
level&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2Bucket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// get / head / list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;// put / delete / multipart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// both&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Pick the least privilege you need, then provide an implementation
Layer: the native Worker binding, or a scoped HTTP API token.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// native Worker binding (env.BUCKET)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// scoped HTTP API token — same client, runs anywhere (e.g. inside&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// a Container process that has no native binding)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteBucketHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The client interface is &lt;strong&gt;identical&lt;/strong&gt; regardless of which Layer you
provide. A Worker can read a bucket over its native binding while a
container process reads the same bucket over a token — same code,
different Layer.&lt;/p&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; Layer is what makes the same client work where there’s
no native binding — inside a &lt;strong&gt;Container&lt;/strong&gt; process, for example.
Providing it mints a scoped &lt;code dir=&quot;auto&quot;&gt;AccountApiToken&lt;/code&gt; and binds a policy with
only the permission groups that access level needs:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AccountApiToken&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LogicalId&lt;/span&gt;&lt;span&gt;}Token`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;bucket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LogicalId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;policies&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;effect&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;allow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;permissionGroups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;.permissionGroups&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// e.g. R2 read-only&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resources&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { [&lt;/span&gt;&lt;span&gt;`com.cloudflare.api.account.${&lt;/span&gt;&lt;span&gt;accountId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;*&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The token’s &lt;code dir=&quot;auto&quot;&gt;value&lt;/code&gt; is injected into the host’s &lt;strong&gt;secrets&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;secret_text&lt;/code&gt; on a Worker, a secret on a Container. At runtime the
client reads it and calls R2’s REST API. No account-wide key, no
manual token plumbing.&lt;/p&gt;
&lt;p&gt;The Read / Write / ReadWrite split and &lt;code dir=&quot;auto&quot;&gt;*Binding&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt;
implementations follow the same convention across KV, Queues, and the
other capability resources. This namespaced convention is the
direction for all bindings — the full migration across AWS,
Cloudflare, and the other providers lands in beta.59.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;command-run-shell-commands-as-resources&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Command&lt;/code&gt;: run shell commands as resources&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;Build&lt;/code&gt; module is gone, replaced by a unified &lt;code dir=&quot;auto&quot;&gt;Command&lt;/code&gt; module
that models shell commands as first-class resources sharing one
executor (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/673&quot;&gt;#673&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Command.Build&lt;/code&gt; (was &lt;code dir=&quot;auto&quot;&gt;Build.Command&lt;/code&gt;) runs a command that produces an
output asset and tracks &lt;code dir=&quot;auto&quot;&gt;outdir&lt;/code&gt; in state. Inputs and outputs are
content-hashed (opt-in via &lt;code dir=&quot;auto&quot;&gt;memo&lt;/code&gt;) so an unchanged project skips the
rebuild:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Build&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;vite-build&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;npm run build&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cwd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./frontend&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;outdir&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dist&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;.outdir)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// path to dist, relative to process.cwd()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Command.Exec&lt;/code&gt; is new. It runs a command purely for its side effects —
migrations, codegen, seeding — with no output contract: it succeeds as
long as the command exits &lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;memo&lt;/code&gt; re-runs it only when its inputs
change:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;migrate&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;npm run db:migrate&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cwd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./packages/api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Command.Dev&lt;/code&gt; (was &lt;code dir=&quot;auto&quot;&gt;Build.DevServer&lt;/code&gt;) is a long-lived dev server scoped
to the stack instance. It runs in the dev sidecar so it survives
user-code HMR, and exposes the first &lt;code dir=&quot;auto&quot;&gt;http(s)://&lt;/code&gt; URL it prints as its
&lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt; output. It’s a no-op during &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Command&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Dev&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Frontend&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;npm run dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;.url)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// e.g. &quot;http://localhost:5173&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; (AWS + Cloudflare) and &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workers.Worker&lt;/code&gt; now
build and dev-serve through &lt;code dir=&quot;auto&quot;&gt;Command&lt;/code&gt;. Resource type IDs were
renamed, so existing state referencing &lt;code dir=&quot;auto&quot;&gt;Build.Command&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;Build.DevServer&lt;/code&gt; won’t match, and &lt;code dir=&quot;auto&quot;&gt;Command.Build&lt;/code&gt;’s output hash
changed from &lt;code dir=&quot;auto&quot;&gt;{ outdir, hash }&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;{ outdir, hash: { input, output } }&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/run-a-container&quot;&gt;Run a Container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects&quot;&gt;Add a Durable Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/cross-worker-durable-object&quot;&gt;Cross-Worker Durable Objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/layers#the-types-hold-the-boundary&quot;&gt;Runtime as a colored function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta58&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.57...v2.0.0-beta.58&quot;&gt;Compare v2.0.0-beta.57 → v2.0.0-beta.58&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.57 - Containers in Dev &amp; AI Search</title><link>https://alchemy.run/blog/2026-06-19-beta-57/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-06-19-beta-57/</guid><description>v2.0.0-beta.57 runs Cloudflare Containers locally in alchemy dev, adds Cloudflare AI Search (AutoRAG) with a typed Worker binding, and lands a large AWS wave — CloudFront VpcOrigin, ELBv2 ListenerRule &amp; TrustStore, Route53 HostedZone &amp; HealthCheck, KMS keys, and Lambda aliases.</description><pubDate>Fri, 19 Jun 2026 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cloudflare Containers now run &lt;strong&gt;locally&lt;/strong&gt; under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; — the
same Container + Durable Object code that deploys to Cloudflare’s
network docker-builds and runs on your machine, no code changes.
beta.57 also adds &lt;strong&gt;Cloudflare AI Search&lt;/strong&gt; (AutoRAG) as a one-call
construct with a typed Worker binding, and a large AWS coverage wave.&lt;/p&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;effect is bumped to &lt;code dir=&quot;auto&quot;&gt;4.0.0-beta.84&lt;/code&gt;&lt;/strong&gt; — update your &lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt;
dependency to match. Upstream renamed &lt;code dir=&quot;auto&quot;&gt;ConfigProvider.get&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;ConfigProvider.load&lt;/code&gt;, so any direct &lt;code dir=&quot;auto&quot;&gt;ConfigProvider&lt;/code&gt; usage needs the
same one-line rename. No alchemy APIs changed.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;containers-run-locally-in-alchemy-dev&quot;&gt;Containers run locally in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;Container&lt;/code&gt; class is unchanged — declare its identity and props,
provide the runtime implementation with &lt;code dir=&quot;auto&quot;&gt;.make()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/SandboxContainer.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxContainer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SandboxContainer&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;SandboxContainer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instanceType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dev&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxContainer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxContainer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;succeed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello from Sandbox container!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A Durable Object binds it, starts it, and talks to it over a TCP
port — again, nothing dev-specific:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/SandboxDO.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SandboxDO&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DurableObjectNamespace&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;SandboxDO&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;SandboxDO&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SandboxContainer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sandbox&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enableInternet&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getTcpPort&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;HttpClientRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://container/&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.text)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;As of beta.57, &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs that container on your machine: the
container program is bundled with rolldown, a Dockerfile is generated
(&lt;code dir=&quot;auto&quot;&gt;FROM oven/bun:1&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;node:22-slim&lt;/code&gt; depending on the container’s
&lt;code dir=&quot;auto&quot;&gt;runtime&lt;/code&gt;, auto-installing any declared externals), and the local
runtime docker-builds the image and wires it into the local Durable
Object namespace.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://localhost:1338/sandbox&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Hello from Sandbox container!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dev-created containers carry a &lt;code dir=&quot;auto&quot;&gt;dev:&amp;#x3C;uuid&gt;&lt;/code&gt; application id, so a
subsequent &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; knows to promote them to a real
&lt;code dir=&quot;auto&quot;&gt;ContainerApplication&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/636&quot;&gt;#636&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflare-ai-search-autorag&quot;&gt;Cloudflare AI Search (AutoRAG)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.AiSearch&lt;/code&gt; stands up a full retrieval-augmented-generation
pipeline over an R2 bucket — chunking, embedding, vector search,
reranking, and generation, all managed by Cloudflare:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;R2Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Docs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiSearch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Search&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Docs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;It’s a &lt;strong&gt;construct&lt;/strong&gt;, not a single resource: for an R2 source it
provisions a least-privilege &lt;code dir=&quot;auto&quot;&gt;AccountApiToken&lt;/code&gt; scoped to the AI Search
Index Engine permission group, wraps it in the &lt;code dir=&quot;auto&quot;&gt;AiSearchToken&lt;/code&gt; service
token the indexer requires, and creates the &lt;code dir=&quot;auto&quot;&gt;AiSearchInstance&lt;/code&gt; with
everything wired together. Pass a URL as &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; instead and it
indexes a website via the web crawler; &lt;code dir=&quot;auto&quot;&gt;prefix&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;include&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;exclude&lt;/code&gt; globs scope what gets indexed.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.AiSearchInstance.bind(search)&lt;/code&gt; gives a Worker a typed
Effect client — &lt;code dir=&quot;auto&quot;&gt;chatCompletions&lt;/code&gt; for full RAG, &lt;code dir=&quot;auto&quot;&gt;search&lt;/code&gt; for
retrieval-only:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Api&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;Api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;aiSearch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Search&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiSearchInstance&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aiSearch&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerRequest&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http://api&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;searchParams&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;q&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;What is this about?&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;search&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chatCompletions&lt;/span&gt;&lt;span&gt;({ messages&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ role&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; }] })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.orDie)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt;.choices[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]?.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;.content&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sources&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;answer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;chunks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((c) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.key)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiSearchInstanceBindingLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;answer.chunks&lt;/code&gt; are the source chunks the answer drew from, so
citations come for free. The binding also works in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;. The
new &lt;a href=&quot;https://alchemy.run/cloudflare/ai/ai-search&quot;&gt;AI Search tutorial&lt;/a&gt; walks through
the whole pipeline, including dropping down to the underlying
&lt;code dir=&quot;auto&quot;&gt;AiSearchInstance&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;AiSearchNamespace&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;AiSearchToken&lt;/code&gt; resources
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/639&quot;&gt;#639&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;an-aws-coverage-wave&quot;&gt;An AWS coverage wave&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Five new resources land in one PR
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/631&quot;&gt;#631&lt;/a&gt;):
CloudFront &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;VpcOrigin&lt;/code&gt;&lt;/strong&gt;, ELBv2 &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;ListenerRule&lt;/code&gt;&lt;/strong&gt; and
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;TrustStore&lt;/code&gt;&lt;/strong&gt; (mTLS), and Route53 &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;HostedZone&lt;/code&gt;&lt;/strong&gt; and
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;HealthCheck&lt;/code&gt;&lt;/strong&gt; — each with live tests.&lt;/p&gt;
&lt;p&gt;Existing resources get much deeper. S3 &lt;code dir=&quot;auto&quot;&gt;Bucket&lt;/code&gt; alone gains
encryption (SSE-KMS/DSSE), public access block, CORS, lifecycle
rules, object ownership/ACL, access logging, website hosting,
replication, intelligent tiering, object lock, and inline &lt;code dir=&quot;auto&quot;&gt;policy&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;S3&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Bucket&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Site&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;versioning&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Enabled&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;encryption&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { sseAlgorithm&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;aws:kms&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; bucketKeyEnabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;publicAccessBlock&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { blockPublicAcls&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; blockPublicPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lifecycleRules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;expire-old&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Enabled&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Filter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Prefix&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;logs/&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Expiration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Days&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;website&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { indexDocument&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { suffix&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;index.html&quot;&lt;/span&gt;&lt;span&gt; } }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;CloudFront &lt;code dir=&quot;auto&quot;&gt;Distribution&lt;/code&gt; picks up origin groups, geo restriction,
access logging, trusted key groups, origin shield, VPC origins, and
gRPC; Route53 &lt;code dir=&quot;auto&quot;&gt;Record&lt;/code&gt; gains routing policies; and RDS, ECS, ELBv2,
and SQS props all deepen — about 8,700 lines in total.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kms-keys-lambda-aliases-log-group-config&quot;&gt;KMS keys, Lambda aliases, log-group config&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Thanks &lt;strong&gt;José Netto&lt;/strong&gt; for a run of AWS contributions: new
&lt;code dir=&quot;auto&quot;&gt;AWS.KMS.Key&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;AWS.KMS.Alias&lt;/code&gt; resources
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/641&quot;&gt;#641&lt;/a&gt;),
a Lambda &lt;code dir=&quot;auto&quot;&gt;Alias&lt;/code&gt; resource
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/625&quot;&gt;#625&lt;/a&gt;),
&lt;code dir=&quot;auto&quot;&gt;reservedConcurrentExecutions&lt;/code&gt; on Lambda &lt;code dir=&quot;auto&quot;&gt;Function&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/628&quot;&gt;#628&lt;/a&gt;),
and &lt;code dir=&quot;auto&quot;&gt;LogGroup&lt;/code&gt; configuration — retention, KMS encryption, log class,
and deletion protection
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/630&quot;&gt;#630&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;KMS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AppKey&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Application encryption key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enableKeyRotation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;KMS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Alias&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AppAlias&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aliasName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alias/app&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;targetKeyId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;.keyId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LogGroup&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ApiLogs&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;retentionInDays&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;kmsKeyId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;.keyArn&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Weighted alias routing shifts traffic between Lambda versions
declaratively:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Lambda&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Alias&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;LiveAlias&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;functionName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;.functionName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;functionVersion&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;2&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;aliasName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;live&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;routingConfig&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AdditionalVersionWeights&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.1&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;hardening-the-cloudflare-fleet&quot;&gt;Hardening the Cloudflare fleet&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-06-17-beta-56&quot;&gt;beta.56&lt;/a&gt; grew the Cloudflare provider 10x
in one release; beta.57 is the flywheel’s second turn — stabilizing
that fleet against the real API. Live tests flagged rough edges in
PageRule, Schema Validation, Images &lt;code dir=&quot;auto&quot;&gt;Variant&lt;/code&gt;, origin post-quantum
encryption, Origin TLS client auth, and Pages &lt;code dir=&quot;auto&quot;&gt;Project&lt;/code&gt;, and each fix
followed the same doctrine: patch the distilled SDK so the API’s
actual behavior becomes a &lt;strong&gt;typed error tag&lt;/strong&gt;, regenerate, and handle
the tag — never a status-code check in alchemy code. The distilled
submodule was repatched and regenerated six times during this release.
Quota- and entitlement-bound live tests now skip cleanly instead of
failing, and transient errors retry on their exact typed tag — e.g.
Magic Network Monitoring retries &lt;code dir=&quot;auto&quot;&gt;MnnConfigMissing&lt;/code&gt; — so an entitled
account runs the full suite unchanged.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;diff.stables&lt;/code&gt; overrides &lt;code dir=&quot;auto&quot;&gt;provider.stables&lt;/code&gt;&lt;/strong&gt; — a provider’s diff
can now narrow stability per-update, fixing spurious replacements
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/635&quot;&gt;#635&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Atomic local state writes&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;LocalState&lt;/code&gt; writes to a temp file
and renames, so a crash mid-write can’t corrupt state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; no longer watches &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt;&lt;/strong&gt;, cutting
file-watcher churn on large projects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/646&quot;&gt;#646&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Queue consumers created in dev promote cleanly&lt;/strong&gt; to a real deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/647&quot;&gt;#647&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local service bindings preserve their entrypoints&lt;/strong&gt; in dev. Thanks
&lt;strong&gt;Jonathan Beckman&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/643&quot;&gt;#643&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Search bindings work in local dev&lt;/strong&gt;. Thanks
&lt;strong&gt;Jonathan Beckman&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/642&quot;&gt;#642&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy cloudflare create-token&lt;/code&gt;&lt;/strong&gt; can now mint user API tokens
and interactively select permissions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Build.Command&lt;/code&gt;&lt;/strong&gt; handles both relative and absolute paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Artifacts.cached&lt;/code&gt;&lt;/strong&gt; is allowed in the local &lt;code dir=&quot;auto&quot;&gt;RpcProvider&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/648&quot;&gt;#648&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub &lt;code dir=&quot;auto&quot;&gt;Repository&lt;/code&gt; docs&lt;/strong&gt; — examples for templates, rename,
archive, and secrets. Thanks &lt;strong&gt;Justin Bennett&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/629&quot;&gt;#629&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS lifecycle hardening&lt;/strong&gt; — Scheduler, SQS DLQ wiring, SNS Topic,
CloudFront, DynamoDB, EC2, IAM, and Kinesis operations retry
eventual consistency and throttling more robustly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare provider docs&lt;/strong&gt; reorganized and categorized, with
missing pages added.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/ai/ai-search&quot;&gt;Add AI Search (AutoRAG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/run-a-container&quot;&gt;Run a Container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects&quot;&gt;Add a Durable Object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta57&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.56...v2.0.0-beta.57&quot;&gt;Compare v2.0.0-beta.56 → v2.0.0-beta.57&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.56 - 200+ Cloudflare Resources</title><link>https://alchemy.run/blog/2026-06-17-beta-56/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-06-17-beta-56/</guid><description>v2.0.0-beta.56 grows the Cloudflare provider from 22 resources to 230, each implemented and live-tested against the real Cloudflare API — plus alchemy unsafe nuke, GitHub webhook event sources, and an S3-backed state store.</description><pubDate>Wed, 17 Jun 2026 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Cloudflare provider grows from &lt;strong&gt;22 resources to 230&lt;/strong&gt; in this
release. A single PR (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/601&quot;&gt;#601&lt;/a&gt;)
lands +101k lines across 542 files — 189 new live-test suites, every
one run against a real Cloudflare account — bringing coverage to over
a hundred Cloudflare services: Zero Trust (Access, Tunnels, Devices,
Gateway, DLP), Magic Transit and Magic Network Monitoring, Load
Balancing, DNS and DNS Firewall, SSL/TLS and certificates, Waiting
Rooms, Logpush, Spectrum, Turnstile, API Shield, Bot Management, Page
Shield, Workers for Platforms, Snippets, Zaraz, Registrar, Addressing,
Alerting, and the rest of the long tail.&lt;/p&gt;
&lt;p&gt;That means an entire Zero Trust deployment — tunnel, private network
route, identity-gated application, WARP device profile — is now a
single Effect (Zero Trust resources contributed by
&lt;strong&gt;&lt;a href=&quot;https://github.com/microagi-andy&quot;&gt;Andy Jefferson&lt;/a&gt;&lt;/strong&gt; in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/570&quot;&gt;#570&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// a private network reachable only through WARP + Access&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tunnel&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Tunnel&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Corp&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ingress&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ hostname&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dashboard.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; service&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http://localhost:3000&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ service&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;http_status:404&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TunnelRoute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PrivateNet&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tunnelId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tunnel&lt;/span&gt;&lt;span&gt;.tunnelId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10.4.0.0/16&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allowCorp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AccessPolicy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AllowCorp&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Allow corp users&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;decision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;allow&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ emailDomain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span&gt; } }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AccessApplication&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Dashboard&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;self_hosted&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;dashboard.example.com&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sessionDuration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;24h&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;policies&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;allowCorp&lt;/span&gt;&lt;span&gt;.policyId]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DeviceDefaultProfile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Default&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;exclude&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;splitTunnelExclude&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ address&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;10.0.0.0/8&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;RFC1918&quot;&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;excludeOfficeIps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;how-a-test-driven-sdk-flywheel&quot;&gt;How: a test-driven SDK flywheel&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The resources were implemented by fleets of AI agents working
service by service against
&lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled&lt;/a&gt;, our generated
Cloudflare SDK. Each agent implements a service’s resources, then
live-tests them against the real API — and when a test hits an API
behavior the types don’t capture, the fix goes into the SDK as a
typed-error patch, not a catch-block in the consumer:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;submodules/distilled/packages/cloudflare/patches/turnstile/getWidget.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;errors&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;WidgetNotFound&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ &lt;/span&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10404&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10407&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;Forbidden&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ &lt;/span&gt;&lt;span&gt;&quot;status&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt; }]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Run that loop across 288 live-test suites and the SDK’s patch set
grows from 369 to &lt;strong&gt;1,087 operations spanning 94 of 114 Cloudflare
services&lt;/strong&gt; — in one release cycle. Each patch records how the API
actually behaves, as a type, for every future consumer of the SDK.&lt;/p&gt;
&lt;p&gt;The full story — the loop, the patches, and the factory that ran
them — is in
&lt;a href=&quot;https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory&quot;&gt;Looping the Generation of IaC and SDKs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;feature-flags-cloudflareflagshipapp&quot;&gt;Feature flags: &lt;code dir=&quot;auto&quot;&gt;Cloudflare.FlagshipApp&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare’s Flagship feature flags land as full resources with an
Effect-native Worker binding
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/602&quot;&gt;#602&lt;/a&gt;).
Declare the app and its flags:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FlagshipApp&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Flags&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FlagshipFlag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NewCheckout&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;appId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;.appId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;new-checkout&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;defaultVariation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;off&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;variations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { off&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;FlagshipApp.bind(app)&lt;/code&gt; attaches the binding to the surrounding Worker
and returns a runtime client for evaluating flags:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FlagshipApp&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Flags&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;FlagsWorker&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;.filename }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FlagshipApp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getBooleanValue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;new-checkout&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;user-42&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;on&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;off&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;provide&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FlagshipBindingLive&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Every method of the runtime &lt;code dir=&quot;auto&quot;&gt;Flagship&lt;/code&gt; binding is mirrored as an
Effect. Async Workers can bind the app on &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; instead and use the
raw binding.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;providerlist-and-alchemy-unsafe-nuke&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Provider.list&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;alchemy unsafe nuke&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Providers can now implement a &lt;code dir=&quot;auto&quot;&gt;list()&lt;/code&gt; lifecycle operation that
enumerates every live resource of their type in the ambient
account/zone
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/620&quot;&gt;#620&lt;/a&gt;) —
each item returned in the same &lt;code dir=&quot;auto&quot;&gt;Attributes&lt;/code&gt; shape &lt;code dir=&quot;auto&quot;&gt;read&lt;/code&gt; produces, so
it’s directly deletable.&lt;/p&gt;
&lt;p&gt;Built on top of it: &lt;code dir=&quot;auto&quot;&gt;alchemy unsafe nuke&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/624&quot;&gt;#624&lt;/a&gt;)
enumerates everything a profile’s providers can see and deletes it
all. With 230 resource types now enumerable, a burned test account is
a one-liner to clean:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unsafe&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nuke&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Cloudflare.*&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--filter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;resource.workerName === &quot;alchemy-state-store&quot;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;--include&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;--exclude&lt;/code&gt; take provider-ID globs; &lt;code dir=&quot;auto&quot;&gt;--filter&lt;/code&gt; takes
JavaScript expressions evaluated with &lt;code dir=&quot;auto&quot;&gt;resource&lt;/code&gt; in scope — any
resource for which an expression is truthy is &lt;strong&gt;spared&lt;/strong&gt;. &lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt;
previews, &lt;code dir=&quot;auto&quot;&gt;--yes&lt;/code&gt; skips the confirmation. The command is deliberately
hidden from &lt;code dir=&quot;auto&quot;&gt;--help&lt;/code&gt;; it deletes real infrastructure.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;github-repositories-and-webhook-events&quot;&gt;GitHub repositories and webhook events&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/just-be-dev&quot;&gt;Justin Bennett&lt;/a&gt;&lt;/strong&gt; contributed
&lt;code dir=&quot;auto&quot;&gt;GitHub.Repository&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/607&quot;&gt;#607&lt;/a&gt;) —
full repository lifecycle with a converging reconciler that reads by
stable numeric id, so renaming a repo out from under the stack doesn’t
corrupt state:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Repository&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;internal-tools&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-org&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;internal-tools&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;visibility&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;private&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleteBranchOnMerge&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;On top of it, &lt;code dir=&quot;auto&quot;&gt;GitHub.events&lt;/code&gt; turns a repository into an &lt;strong&gt;event
source&lt;/strong&gt; for Cloudflare Workers
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/619&quot;&gt;#619&lt;/a&gt;).
Subscribing in a Worker’s init provisions a &lt;code dir=&quot;auto&quot;&gt;GitHub.Webhook&lt;/code&gt; pointed
at the Worker’s URL; at runtime, deliveries are verified with a
constant-time HMAC-SHA256 signature check and handed to your handler
as fully-typed payloads:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Config&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;redacted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;GITHUB_WEBHOOK_SECRET&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// `event.name` is narrowed to &quot;push&quot; | &quot;pull_request&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-org&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repository&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;events&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;push&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;pull_request&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;secret&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}).&lt;/span&gt;&lt;span&gt;subscribe&lt;/span&gt;&lt;span&gt;((event) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`received ${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.name&lt;/span&gt;&lt;span&gt;} (${&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.id&lt;/span&gt;&lt;span&gt;})`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;s3-backed-state-store-awsstate&quot;&gt;S3-backed state store: &lt;code dir=&quot;auto&quot;&gt;AWS.state()&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;AWS stacks get a first-class remote state backend, mirroring
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.state()&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/585&quot;&gt;#585&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Stack&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;my-stack&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ providers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;providers&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;() }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;State lives at &lt;code dir=&quot;auto&quot;&gt;s3://{bucket}/{prefix}{stack}/{stage}/{fqn}.json&lt;/code&gt;. By
default the bucket is an auto-created account-regional bucket
(&lt;code dir=&quot;auto&quot;&gt;alchemy-state-{accountId}-{region}-an&lt;/code&gt;); pass &lt;code dir=&quot;auto&quot;&gt;bucketName&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;prefix&lt;/code&gt; to use your own. Credential resolution and bucket creation
are deferred to the first state operation, so nothing touches AWS at
layer construction.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;bundle: false&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Worker&lt;/code&gt;&lt;/strong&gt; uploads a prebuilt &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt;
byte-for-byte — no rolldown, no minification — with glob-based
&lt;code dir=&quot;auto&quot;&gt;rules&lt;/code&gt; selecting additional modules. The working path for OpenNext
and other externally-bundled outputs. Thanks
&lt;strong&gt;&lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/592&quot;&gt;#592&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy plan&lt;/code&gt; starts near-instant&lt;/strong&gt; — 8.2s → 1.8s warm, via
lazy-loading the TUI and vite plugin and deferring distilled schema
construction
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/618&quot;&gt;#618&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;worker.url&lt;/code&gt; is stable across deploys&lt;/strong&gt; when the first domain is
unchanged, so downstream resources referencing it (e.g. webhook
delivery URLs) stop phantom-updating
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/616&quot;&gt;#616&lt;/a&gt;);
same for &lt;code dir=&quot;auto&quot;&gt;worker.durableObjectNamespaces&lt;/code&gt; when the DO class set is
unchanged
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/617&quot;&gt;#617&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda function URLs accept full config&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;url: { authType: &quot;AWS_IAM&quot;, cors, invokeMode: &quot;RESPONSE_STREAM&quot; }&lt;/code&gt;;
IAM-auth URLs drop the public permission statement. Thanks
&lt;strong&gt;&lt;a href=&quot;https://github.com/mineiro&quot;&gt;José Netto&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/614&quot;&gt;#614&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; stays alive when an apply fails&lt;/strong&gt;, logging the full
cause instead of silently exiting. Thanks
&lt;strong&gt;&lt;a href=&quot;https://github.com/Butch78&quot;&gt;Matthew Aylward&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/582&quot;&gt;#582&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;StaticSite forwards &lt;code dir=&quot;auto&quot;&gt;dev.env&lt;/code&gt;&lt;/strong&gt; (including Redacted secrets) to
the external dev-server command. Thanks
&lt;strong&gt;&lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/587&quot;&gt;#587&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local assets binding no longer 500s&lt;/strong&gt; in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/613&quot;&gt;#613&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drizzle drift detection is cached&lt;/strong&gt; per plan/apply cycle, so
drizzle-kit’s interactive rename prompt appears once instead of
hanging &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/597&quot;&gt;#597&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory&quot;&gt;Looping the Generation of IaC and SDKs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-code/provider&quot;&gt;Concepts › Providers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/state-store&quot;&gt;Concepts › State Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cli&quot;&gt;CLI guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/lambda&quot;&gt;Deploy a Lambda Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta56&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.55...v2.0.0-beta.56&quot;&gt;Compare v2.0.0-beta.55 → v2.0.0-beta.56&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.55 - AI Gateway Spend Caps</title><link>https://alchemy.run/blog/2026-06-11-beta-55/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-06-11-beta-55/</guid><description>v2.0.0-beta.55 adds Cloudflare.AiGatewaySpendingLimit — a declarative hard cap on account-wide AI Gateway spend — and re-exports the fetcher interop utils from alchemy/Cloudflare/Bridge so framework workers can wrap a service binding in a typed HttpClient.</description><pubDate>Thu, 11 Jun 2026 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An AI Gateway sits in front of your model calls, which means it’s also
where a runaway loop turns into a runaway bill. beta.55 puts the
guardrail in your stack: &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.AiGatewaySpendingLimit&lt;/code&gt;&lt;/strong&gt; sets a
hard dollar cap on cumulative AI Gateway spend across every gateway in
the account, declared and reconciled like any other resource.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflareaigatewayspendinglimit&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.AiGatewaySpendingLimit&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Amounts are in &lt;strong&gt;cents&lt;/strong&gt; (Cloudflare’s native unit — minimum &lt;code dir=&quot;auto&quot;&gt;1_00&lt;/code&gt; =
$1.00), accumulated over a &lt;code dir=&quot;auto&quot;&gt;daily&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;weekly&lt;/code&gt;, or &lt;code dir=&quot;auto&quot;&gt;monthly&lt;/code&gt; window with a
&lt;code dir=&quot;auto&quot;&gt;fixed&lt;/code&gt; (reset on the boundary) or &lt;code dir=&quot;auto&quot;&gt;sliding&lt;/code&gt; (rolling window) strategy:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Cloudflare&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Cloudflare requires one manual credit top-up before a spending limit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// can be set. `topUp` reconciles that requirement: the provider observes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// the billing state and only charges the account&apos;s default payment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// method if the account has never topped up.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiGatewaySpendingLimit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ai-spend-cap&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;250_00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// cents -&gt; $250.00 (minimum 1_00 = $1.00)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;duration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;monthly&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;topUp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10_00&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// cents -&gt; $10.00 (Cloudflare minimum)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;topUp&lt;/code&gt; prop deals with Cloudflare’s bootstrap requirement:
an account can’t set a spending limit until it has loaded Unified
Billing credits via at least one manual top-up (&lt;code dir=&quot;auto&quot;&gt;NO_MANUAL_TOPUP&lt;/code&gt;).
The provider observes &lt;code dir=&quot;auto&quot;&gt;first_topup_success&lt;/code&gt; on the live billing API
and only makes the one-time charge when the account has never topped
up — once bootstrapped, the prop is inert and never charges again. If
the payment needs interactive confirmation (3-D Secure), the resource
fails with a typed &lt;code dir=&quot;auto&quot;&gt;AiGatewaySpendingLimitTopupRequired&lt;/code&gt; error and the
top-up must be completed in the dashboard.&lt;/p&gt;
&lt;p&gt;Auto recharge is on by default — when the credit balance drops below
&lt;code dir=&quot;auto&quot;&gt;threshold&lt;/code&gt;, Cloudflare recharges by &lt;code dir=&quot;auto&quot;&gt;amount&lt;/code&gt; automatically:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AiGatewaySpendingLimit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ai-spend-cap&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;250_00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;duration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;monthly&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;topUp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { amount&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;20_00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; threshold&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;10_00&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// recharge $20 below $10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Set &lt;code dir=&quot;auto&quot;&gt;topUp: { amount: 10_00, autoRecharge: false }&lt;/code&gt; for a one-time
bootstrap only.&lt;/p&gt;
&lt;p&gt;One caveat: Cloudflare stores a &lt;strong&gt;single limit per account&lt;/strong&gt;, so this
resource is a per-account singleton — declare exactly one. Thanks
&lt;strong&gt;&lt;a href=&quot;https://github.com/Butch78&quot;&gt;Matthew Aylward&lt;/a&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/569&quot;&gt;#569&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;fetcher-utils-on-alchemycloudflarebridge&quot;&gt;Fetcher utils on &lt;code dir=&quot;auto&quot;&gt;alchemy/Cloudflare/Bridge&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The fetcher/socket interop helpers — &lt;code dir=&quot;auto&quot;&gt;fromCloudflareFetcher&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;toCloudflareFetcher&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;toHttpClient&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;fromCloudflareSocket&lt;/code&gt; — are now
exported from the &lt;code dir=&quot;auto&quot;&gt;alchemy/Cloudflare/Bridge&lt;/code&gt; entrypoint, and
&lt;code dir=&quot;auto&quot;&gt;fromCloudflareFetcher&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;fromCloudflareSocket&lt;/code&gt; accept the global
&lt;code dir=&quot;auto&quot;&gt;Fetcher&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Socket&lt;/code&gt; types directly
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/581&quot;&gt;#581&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;That combination matters inside a framework worker (TanStack Start,
Astro, …), where your Effect backend arrives as a plain service binding
on &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;. Two calls turn it into a fully typed Effect &lt;code dir=&quot;auto&quot;&gt;HttpClient&lt;/code&gt; —
no casts:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy/Cloudflare/Bridge&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHttpClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fromCloudflareFetcher&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BACKEND&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; client&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`https://backend/?key=${&lt;/span&gt;&lt;span&gt;encodeURIComponent&lt;/span&gt;&lt;span&gt;(key)&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pipe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Effect&lt;/span&gt;&lt;span&gt;.runPromise)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toWeb&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;HttpServerResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fromClientResponse&lt;/span&gt;&lt;span&gt;(res)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The request rides the in-account service binding, not the public
network. The &lt;code dir=&quot;auto&quot;&gt;cloudflare-website-tanstack-start&lt;/code&gt; example’s &lt;code dir=&quot;auto&quot;&gt;/api/hello&lt;/code&gt; route now
serves the same object four ways side by side — the raw R2 binding,
the service binding’s &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;, typed RPC (&lt;code dir=&quot;auto&quot;&gt;toRpcAsync&lt;/code&gt;), and this
&lt;code dir=&quot;auto&quot;&gt;HttpClient&lt;/code&gt; form — each covered by an integration test.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;also-in-this-release&quot;&gt;Also in this release&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed a dangling process that kept &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;alchemy destroy&lt;/code&gt;
from exiting&lt;/strong&gt; — local &lt;code dir=&quot;auto&quot;&gt;RpcProvider&lt;/code&gt; service layers (&lt;code dir=&quot;auto&quot;&gt;providerServices&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;providerServicesEffect&lt;/code&gt;) now only construct when &lt;code dir=&quot;auto&quot;&gt;AlchemyContext.dev&lt;/code&gt;
is set, so one-shot CLI runs no longer spin up the local dev provider
machinery (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/580&quot;&gt;#580&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;where-to-go-next&quot;&gt;Where to go next&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/ai/ai-gateway&quot;&gt;Add an AI Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/frontends&quot;&gt;Frontend frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta55&quot;&gt;CHANGELOG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.54...v2.0.0-beta.55&quot;&gt;Compare v2.0.0-beta.54 → v2.0.0-beta.55&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>