<?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-10.xml"/><item><title>2.0.0-beta.85 - Effect 4.1, Domain Replay &amp; DynamoDB State</title><link>https://alchemy.run/blog/2026-11-01-beta-85/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-11-01-beta-85/</guid><description>Effect 4.1, Alchemy Domain deploys that backfill and rebuild views and projections, Domain models served over HTTP, MCP and the CLI, redesigned Cloud Run containers and keyless AWS↔GCP bindings, custom domains with any DNS provider, DynamoDB state, Alchemist, the @alchemy.run/test runner, and 95 bug fixes.</description><pubDate>Sun, 01 Nov 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.85 is 249 pull requests from 39 contributors: 84 features and 95 bug
fixes.&lt;/p&gt;
&lt;p&gt;It moves Alchemy to &lt;strong&gt;Effect 4.1&lt;/strong&gt;. Alchemy Domain’s deploys now &lt;strong&gt;roll out
every model change&lt;/strong&gt; by replaying history, and one Domain model can be served
&lt;strong&gt;over HTTP, MCP or the CLI&lt;/strong&gt;, so people and agents reach it however they
prefer. GCP gets &lt;strong&gt;redesigned Cloud Run services and containers&lt;/strong&gt; and &lt;strong&gt;connects to AWS
without keys&lt;/strong&gt;. Custom domains work with &lt;strong&gt;any DNS provider&lt;/strong&gt;, the
&lt;strong&gt;Cloudflare state store&lt;/strong&gt; takes its Worker name, account and domain, &lt;strong&gt;AWS
state uses DynamoDB&lt;/strong&gt; and plans 270× faster, &lt;strong&gt;Alchemist&lt;/strong&gt; exposes the whole CLI
as a programmatic API, and Alchemy’s test runner ships as
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/test&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;aside aria-label=&quot;Danger&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Danger&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Upgrade the Cloudflare state store to v8, and don’t go back&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Your next &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; asks to upgrade the store (pass &lt;code dir=&quot;auto&quot;&gt;--yes&lt;/code&gt; in CI). After
that, don’t run an older Alchemy against it: you risk losing the encryption key,
which nothing can recover. Upgrade every machine and CI job together
(&lt;a href=&quot;#cloudflare-state-store-v8&quot;&gt;below&lt;/a&gt;).&lt;/p&gt;&lt;/div&gt;&lt;/aside&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 4.1&lt;/strong&gt;: bump &lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;@effect/*&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;^4.1.0&lt;/code&gt; (&lt;a href=&quot;#effect-41&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;Cloudflare.state({ name })&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;workerName&lt;/code&gt;&lt;/strong&gt;, the store’s full Worker name, and &lt;code dir=&quot;auto&quot;&gt;--name&lt;/code&gt; takes the Worker name too: &lt;code dir=&quot;auto&quot;&gt;name: &quot;team-a&quot;&lt;/code&gt; becomes &lt;code dir=&quot;auto&quot;&gt;workerName: &quot;alchemy-state-store-team-a&quot;&lt;/code&gt;, the same Worker and secrets (&lt;a href=&quot;#choose-the-worker-name&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;AWS.state()&lt;/code&gt; uses DynamoDB&lt;/strong&gt;: run &lt;code dir=&quot;auto&quot;&gt;alchemy state migrate&lt;/code&gt;, or keep S3 with &lt;code dir=&quot;auto&quot;&gt;AWS.state({ backend: &quot;s3&quot; })&lt;/code&gt; (&lt;a href=&quot;#aws-state-now-uses-dynamodb-and-plans-270-faster&quot;&gt;below&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lambda event-source handlers take the Lambda event&lt;/strong&gt; instead of a &lt;code dir=&quot;auto&quot;&gt;Stream&lt;/code&gt;, and can return a partial batch response (&lt;a href=&quot;#lambda-aliases-streaming-and-partial-batch-failures&quot;&gt;below&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;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeQueueMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;span&gt;&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;((record) &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;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;record&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;queue&lt;/span&gt;&lt;span&gt;,&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;for&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;record&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;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Records&lt;/span&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;record&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;/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;Test.make&lt;/code&gt; moved to &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/test&lt;/code&gt;&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;alchemy/Test/Alchemy&lt;/code&gt; is now &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/test/Alchemy&lt;/code&gt;, and the same for &lt;code dir=&quot;auto&quot;&gt;Bun&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Vitest&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Core&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Http&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;TestState&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2621&quot;&gt;#2621&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GCP profiles&lt;/strong&gt;: the &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; method is gone, and &lt;code dir=&quot;auto&quot;&gt;gcloud&lt;/code&gt; profiles name a configuration; run &lt;code dir=&quot;auto&quot;&gt;alchemy profile edit --reconfigure GCP&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2680&quot;&gt;#2680&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;GCP.Run.Container&lt;/code&gt; is now a resource&lt;/strong&gt;; the container-spec type it named is &lt;code dir=&quot;auto&quot;&gt;GCP.Run.ContainerSpec&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2652&quot;&gt;#2652&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain models are upgraded on the next deploy&lt;/strong&gt;: their Durable Object classes are renamed after their model, and their data moves with them (&lt;a href=&quot;#alchemy-upgrades-your-deployed-model&quot;&gt;below&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Durable Object Domain platform and workflow engine are factories&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;layerDurableObjects()&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;layerDurableObjectEngine()&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2601&quot;&gt;#2601&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain clients&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;bank.WithdrawMoney(target, input, options)&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2561&quot;&gt;#2561&lt;/a&gt;); &lt;code dir=&quot;auto&quot;&gt;watch&lt;/code&gt; streams &lt;code dir=&quot;auto&quot;&gt;{ state, cursor }&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;events&lt;/code&gt; ends with &lt;code dir=&quot;auto&quot;&gt;CaughtUp&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2579&quot;&gt;#2579&lt;/a&gt;); &lt;code dir=&quot;auto&quot;&gt;Domain.Api&lt;/code&gt; takes &lt;code dir=&quot;auto&quot;&gt;{ model }&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;api.entries&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;api.serves&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2820&quot;&gt;#2820&lt;/a&gt;); &lt;code dir=&quot;auto&quot;&gt;testClient&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;clientInProcess&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2550&quot;&gt;#2550&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain stories&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;externalSystems&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;stub&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;expectCall&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;call&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;resolve&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;succeed&lt;/code&gt;, every call needs a &lt;code dir=&quot;auto&quot;&gt;call&lt;/code&gt; step, and unasserted events fail the story (&lt;a href=&quot;#update-your-stories&quot;&gt;how to update&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain checks&lt;/strong&gt;: a command’s &lt;code dir=&quot;auto&quot;&gt;target&lt;/code&gt; must be its aggregate’s &lt;code dir=&quot;auto&quot;&gt;id&lt;/code&gt; schema (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2563&quot;&gt;#2563&lt;/a&gt;), and an adapter returning a value its schema rejects now dies (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2548&quot;&gt;#2548&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare DNS&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;foundationDns: true&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;nameservers: { type: &quot;cloudflare.advanced&quot; }&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2501&quot;&gt;#2501&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;Cloudflare.Access.Organization&lt;/code&gt;&lt;/strong&gt; resets settings your stack doesn’t declare (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2291&quot;&gt;#2291&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;GCP.SQL.Instance&lt;/code&gt;&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;ipv4Enabled&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;ipConfiguration.ipv4Enabled&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;backupEnabled&lt;/code&gt; is &lt;code dir=&quot;auto&quot;&gt;backup.enabled&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2642&quot;&gt;#2642&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;Ruleset&lt;/code&gt; rules are top-level props (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2582&quot;&gt;#2582&lt;/a&gt;), and errors and credentials come from the distilled GitHub SDK (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2530&quot;&gt;#2530&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error fields named &lt;code dir=&quot;auto&quot;&gt;name&lt;/code&gt;&lt;/strong&gt; are renamed, mostly to &lt;code dir=&quot;auto&quot;&gt;resourceName&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2689&quot;&gt;#2689&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;--log-ansi&lt;/code&gt; is removed&lt;/strong&gt;, and telemetry no longer exports log records (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2765&quot;&gt;#2765&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-41&quot;&gt;Effect 4.1&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy now runs on Effect 4.1
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2754&quot;&gt;#2754&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;effect@^4.1.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-node@^4.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Effect 4.1 deletes &lt;code dir=&quot;auto&quot;&gt;effect/Crypto&lt;/code&gt;. Its &lt;code dir=&quot;auto&quot;&gt;SecureRandom&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Digest&lt;/code&gt; services
replace it, and the platform layer provides them, so &lt;code dir=&quot;auto&quot;&gt;StackServices&lt;/code&gt; changes
with 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;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;StackServices&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&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;FileSystem&lt;/span&gt;&lt;/div&gt;&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;Crypto&lt;/span&gt;&lt;/div&gt;&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;Digest&lt;/span&gt;&lt;/div&gt;&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;SecureRandom&lt;/span&gt;&lt;/div&gt;&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;Path&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Foldkit projects need &lt;code dir=&quot;auto&quot;&gt;foldkit@^0.170&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;@foldkit/vite-plugin@^0.29&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2790&quot;&gt;#2790&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemy-domain&quot;&gt;Alchemy Domain&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy Domain shipped 30 features this release. Thanks
&lt;a href=&quot;https://github.com/artile&quot;&gt;Taras Kornichuk&lt;/a&gt;, who built most of them!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;deploys-roll-out-every-change-to-a-model&quot;&gt;Deploys roll out every change to a model&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A Domain model’s views and projections are derived from its events. Change
the model, and the deploy brings every consumer up to date from the history,
with no script to write
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2725&quot;&gt;#2725&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2875&quot;&gt;#2875&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You change&lt;/th&gt;
&lt;th&gt;The deploy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;add a view or projection&lt;/td&gt;
&lt;td&gt;feeds it every past event, in the order it was recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bump a view’s &lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;recomputes it, and every view and projection that reads it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bump a projection’s &lt;code dir=&quot;auto&quot;&gt;version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;runs it again over the whole history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list a view as &lt;code dir=&quot;auto&quot;&gt;lazy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;skips the backfill; each key fills itself on first read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;add a policy&lt;/td&gt;
&lt;td&gt;acts on new events only, so the past is never acted on twice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;remove a view or projection&lt;/td&gt;
&lt;td&gt;stops it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Adding a view is one line in the model:&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;// deploy 1&lt;/span&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;Bank&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;Domain&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;&quot;Bank&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { aggregates&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Account&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;// deploy 2: AccountSummary folds every earlier event&lt;/span&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;Bank&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;Domain&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;&quot;Bank&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;aggregates&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Account&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;views&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;AccountSummary&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;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;Changing what a view computes is a version bump:&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;AccountSummary&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;Domain&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;View&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;AccountSummary&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;from&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Account&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Account&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Struct&lt;/span&gt;&lt;span&gt;({ net&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;Number&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;initial&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { net&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;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;evolve&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;MoneyDeposited&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (v&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; ({ net&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;.net &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.amount })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// new: applied to every past withdrawal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;MoneyWithdrawn&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (v&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; ({ net&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;.net &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.amount })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;version&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The deploy picks the cheapest correct strategy. A view keyed by the one
aggregate it reads is rebuilt in place: each key re-reads its own
aggregate’s events the first time it’s touched, so the deploy waits for
nothing. Any other view, such as a total across every account, is rebuilt
from the history in new storage, and the deploy waits and reports progress:&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;[DomainBackfillRun] Backfilling view:Deposits reading history 41% (&lt;/span&gt;&lt;span&gt;1,690/4,096&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;subtrees,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;410,211&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instances&lt;/span&gt;&lt;span&gt;) (&lt;/span&gt;&lt;span&gt;48s&lt;/span&gt;&lt;span&gt;) ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[DomainBackfillRun] Backfilled view:Deposits (&lt;/span&gt;&lt;span&gt;112.4s&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;Reads stay correct while new code rolls out, &lt;code dir=&quot;auto&quot;&gt;history.complete&lt;/code&gt; tells a
screen when a view has caught up, and a deploy interrupted halfway picks up
where it stopped.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;how-it-scales&quot;&gt;How it scales&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;On Cloudflare the replay runs as Durable Objects, not on the deploying
machine. Every aggregate instance lists itself in a directory on its first
commit: a tree where each node holds up to 256 instances and splits into 16
children when it fills. A backfill’s root splits that directory into a few
hundred subtrees and hands them to relays. A relay given more than six items
splits them among six child relays. Six because a Cloudflare Worker
invocation runs at most six outgoing calls at a time, so a seventh would only
wait in line. The tree grows deeper instead of wider, about log₆ of the
instance count: 6 levels for 10,000 instances, 8 for a million.&lt;/p&gt;
&lt;figure id=&quot;bf&quot; aria-label=&quot;A backfill tree growing deeper as the Domain grows&quot;&gt;&lt;div&gt;&lt;span id=&quot;bf-step&quot;&gt;&lt;/span&gt;&lt;span role=&quot;group&quot; aria-label=&quot;Instances&quot;&gt;&lt;button type=&quot;button&quot; data-size=&quot;0&quot;&gt;10k&lt;/button&gt;&lt;button type=&quot;button&quot; data-size=&quot;1&quot;&gt;100k&lt;/button&gt;&lt;button type=&quot;button&quot; data-size=&quot;2&quot;&gt;1M&lt;/button&gt;&lt;/span&gt;&lt;button type=&quot;button&quot; id=&quot;bf-pause&quot; aria-pressed=&quot;false&quot;&gt;❚❚ Pause&lt;/button&gt;&lt;/div&gt;&lt;svg id=&quot;bf-svg&quot; viewBox=&quot;0 0 820 420&quot; role=&quot;img&quot; aria-hidden=&quot;true&quot;&gt;&lt;/svg&gt;&lt;figcaption&gt;One path down the tree; at every level the other five relays do the same beside it. Each relay calls at most six at once, because a Cloudflare Worker invocation runs at most six outgoing calls at a time.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;At the bottom, a view keyed by its aggregate reads its own instance’s events
and applies them. A view that many instances feed, like a timeline, gets a
scanner per instance that pushes each key its share; once every scanner has
pushed, each key applies its events in the order they were recorded. Every
part of the run is a class only the new code has, so nothing starts on the
old code while Cloudflare rolls the deploy out.&lt;/p&gt;
&lt;p&gt;We measured it on Cloudflare, rebuilding a view over accounts with 10
deposits each:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Accounts&lt;/th&gt;
&lt;th&gt;Events&lt;/th&gt;
&lt;th&gt;The deploy waited&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;13 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;1,000,000&lt;/td&gt;
&lt;td&gt;58 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000,000&lt;/td&gt;
&lt;td&gt;10,000,000&lt;/td&gt;
&lt;td&gt;8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Past about 100,000 accounts the limit isn’t the tree but Cloudflare’s cap on
how fast one account can create and call Durable Objects. The run paces
itself to that cap the way TCP does: it sends more while the account keeps
up, halves when Cloudflare refuses calls, and resends the refused work. The
million-account run held about 2,000 keys a second.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/domain/model#consumers-added-later-receive-the-history&quot;&gt;Consumers added later receive the history&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/model#change-a-view-bump-its-version&quot;&gt;Change a view: bump its version&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/model#fill-a-view-lazily&quot;&gt;Fill a view lazily&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/backfill#width&quot;&gt;History at scale&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;alchemy-upgrades-your-deployed-model&quot;&gt;Alchemy upgrades your deployed model&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A Domain model is more than code: on Cloudflare it is a set of Durable
Object classes holding every aggregate, view row and running saga. Changing
how those classes are laid out would normally mean a hand-written migration
and a careful cutover. In Alchemy it’s part of the deploy.&lt;/p&gt;
&lt;p&gt;From this release, the deployed layout is versioned. Every Worker that hosts
a model records the Domain version it was deployed with, and the Worker’s
reconciler upgrades older layouts on the next deploy, renaming classes in
place in the same upload, so no data is copied or lost
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2560&quot;&gt;#2560&lt;/a&gt;). Future layout
changes ship as new upgrade steps in Alchemy, and your deploy applies them.
A Worker deployed by a newer Alchemy is never moved back: an older one
refuses with &lt;code dir=&quot;auto&quot;&gt;DomainVersionTooNew&lt;/code&gt; before uploading anything.&lt;/p&gt;
&lt;p&gt;For the bank example, the first deploy with beta.85 changes the Worker like
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;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;tag    (none)&lt;/span&gt;&lt;/div&gt;&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    alchemy:domain:v0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class  AccountAggregate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class  Bank.AccountAggregate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class  OpenAccountWorkflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class  Bank.OpenAccountWorkflow&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 renames ride in the same upload as the new code, as Cloudflare
&lt;code dir=&quot;auto&quot;&gt;renamed_classes&lt;/code&gt; migrations, so every account and running saga keeps its
storage and nothing is copied.&lt;/p&gt;
&lt;p&gt;This is what DDD buys you here. Because Alchemy knows the shape of your
model (its aggregates, views and sagas), it can own the infrastructure under
it, and evolve that infrastructure for you the same way it evolves a view.&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;The first deploy with beta.85 upgrades every Worker that hosts a Domain
model. Its Durable Object classes are renamed after their model, for example
&lt;code dir=&quot;auto&quot;&gt;AccountAggregate&lt;/code&gt; becomes &lt;code dir=&quot;auto&quot;&gt;Bank.AccountAggregate&lt;/code&gt;, and their data moves with
them.&lt;/p&gt;&lt;p&gt;If two models in one Worker listed the same aggregate, they shared one class
and its data before this release, and the deploy fails with
&lt;code dir=&quot;auto&quot;&gt;AmbiguousDomainLegacyData&lt;/code&gt; until you pick the model that keeps 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;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;BillingLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Billing&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;BillingHandlers&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;legacyData&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;span&gt;// Billing keeps the shared data; Audit starts empty&lt;/span&gt;&lt;/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;/aside&gt;
&lt;p&gt;Each model now owns its data, so two models that list the same aggregate get
separate instances, even in one Worker. And a model can keep all of it in a
Cloudflare jurisdiction (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2601&quot;&gt;#2601&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;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;DomainCloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layerDurableObjects&lt;/span&gt;&lt;span&gt;({ jurisdiction&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;eu&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;A jurisdiction is part of an object’s identity, so a model that already has
data starts empty in its new jurisdiction, and its old objects stay where
they were.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/domain/cloudflare#upgrade-without-losing-data&quot;&gt;Upgrade without losing data&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/cloudflare#keep-the-model-in-a-jurisdiction&quot;&gt;Keep the model in a jurisdiction&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;serve-a-domain-model-over-http-mcp-or-the-cli&quot;&gt;Serve a Domain model over HTTP, MCP or the CLI&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;Domain.Api&lt;/code&gt; names the parts of a model a client may reach
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2820&quot;&gt;#2820&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BankApi&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;Domain&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;&quot;BankApi&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;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Bank&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;commands&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;DepositMoney&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;WithdrawMoney&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;views&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;AccountSummary&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;figure&gt;&lt;svg viewBox=&quot;0 0 900 420&quot; role=&quot;img&quot; aria-label=&quot;Clients reach the Bank model only through BankApi, which exposes two commands and a view&quot;&gt;&lt;rect x=&quot;300&quot; y=&quot;12&quot; width=&quot;588&quot; height=&quot;396&quot; rx=&quot;18&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;318&quot; y=&quot;392&quot;&gt;Bank · bounded context&lt;/text&gt;&lt;text x=&quot;530&quot; y=&quot;44&quot;&gt;exposed&lt;/text&gt;&lt;text x=&quot;810&quot; y=&quot;44&quot;&gt;private&lt;/text&gt;&lt;path d=&quot;M192 112C202 112 202 197 212 197&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M192 197C202 197 202 197 212 197&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M192 282C202 282 202 197 212 197&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M388 197C415 197 415 112 442 112&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M388 197C415 197 415 197 442 197&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M388 197C415 197 415 282 442 282&quot;&gt;&lt;/path&gt;&lt;g transform=&quot;translate(16 89)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;176&quot; height=&quot;46&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(35.1, 12) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M3 5h18v14H3z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 9h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 7h.01&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M9 7h.01&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;55.1&quot; y=&quot;19&quot; dominant-baseline=&quot;middle&quot;&gt;HTTP client&lt;/text&gt;&lt;text x=&quot;88&quot; y=&quot;37&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot;&gt;toHttpApi&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(16 174)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;176&quot; height=&quot;46&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(58.5, 12) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M11 3l2 5.5L18.5 10.5 13 12.5 11 18l-2-5.5L3.5 10.5 9 8.5z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 15l.9 2.1L22 18l-2.1.9L19 21l-.9-2.1L16 18l2.1-.9z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;78.5&quot; y=&quot;19&quot; dominant-baseline=&quot;middle&quot;&gt;Agent&lt;/text&gt;&lt;text x=&quot;88&quot; y=&quot;37&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot;&gt;toMcp&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(16 259)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;176&quot; height=&quot;46&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(46.8, 12) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M4 17l6-6-6-6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 19h8&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;66.8&quot; y=&quot;19&quot; dominant-baseline=&quot;middle&quot;&gt;Terminal&lt;/text&gt;&lt;text x=&quot;88&quot; y=&quot;37&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot;&gt;toCli&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(212 174)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;176&quot; height=&quot;46&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(50.7, 12) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M12 3a9 9 0 1 0 0 18a9 9 0 1 0 0-18z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 12h18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 3c3 3 3 15 0 18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 3c-3 3-3 15 0 18&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;70.7&quot; y=&quot;19&quot; dominant-baseline=&quot;middle&quot;&gt;BankApi&lt;/text&gt;&lt;text x=&quot;88&quot; y=&quot;37&quot; text-anchor=&quot;middle&quot; dominant-baseline=&quot;middle&quot;&gt;the only way in&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(442 89)&quot;&gt;&lt;g&gt;&lt;path d=&quot;M 6 0 H 164 L 176 23 L 164 46 H 6 Q 0 46 0 40 V 6 Q 0 0 6 0 Z&quot;&gt;&lt;/path&gt;&lt;g transform=&quot;translate(31.200000000000003, 17) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M21 3L10 14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 3l-6.5 18-4.5-7-7-4.5z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;51.2&quot; y=&quot;24&quot; dominant-baseline=&quot;middle&quot;&gt;DepositMoney&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(442 174)&quot;&gt;&lt;g&gt;&lt;path d=&quot;M 6 0 H 164 L 176 23 L 164 46 H 6 Q 0 46 0 40 V 6 Q 0 0 6 0 Z&quot;&gt;&lt;/path&gt;&lt;g transform=&quot;translate(27.300000000000004, 17) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M21 3L10 14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M21 3l-6.5 18-4.5-7-7-4.5z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;47.300000000000004&quot; y=&quot;24&quot; dominant-baseline=&quot;middle&quot;&gt;WithdrawMoney&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(442 259)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;176&quot; height=&quot;46&quot; rx=&quot;23&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(23.400000000000006, 17) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 9a3 3 0 1 0 0 6a3 3 0 1 0 0-6z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;43.400000000000006&quot; y=&quot;24&quot; dominant-baseline=&quot;middle&quot;&gt;AccountSummary&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(722 67)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;160&quot; height=&quot;34&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;4&quot; y=&quot;4&quot; width=&quot;152&quot; height=&quot;26&quot; rx=&quot;5&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(42.7, 11) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M12 3l8 4.5v9L12 21l-8-4.5v-9z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4 7.5l8 4.5 8-4.5&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 12v9&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;62.7&quot; y=&quot;18&quot; dominant-baseline=&quot;middle&quot;&gt;Account&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(722 131)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;160&quot; height=&quot;34&quot; rx=&quot;17&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(34.9, 11) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 9a3 3 0 1 0 0 6a3 3 0 1 0 0-6z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;54.9&quot; y=&quot;18&quot; dominant-baseline=&quot;middle&quot;&gt;Statement&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(722 195)&quot;&gt;&lt;g&gt;&lt;path d=&quot;M 9 0 H 151 L 160 9 V 25 L 151 34 H 9 L 0 25 V 9 Z&quot;&gt;&lt;/path&gt;&lt;g transform=&quot;translate(27.1, 11) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M12 3v18&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 21h12&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 7h14&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M5 7l-3 7a3 3 0 0 0 6 0z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M19 7l-3 7a3 3 0 0 0 6 0z&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;47.1&quot; y=&quot;18&quot; dominant-baseline=&quot;middle&quot;&gt;FraudReview&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(722 259)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;160&quot; height=&quot;34&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(46.6, 11) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M4 6c0-1.7 3.6-3 8-3s8 1.3 8 3-3.6 3-8 3-8-1.3-8-3z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4 6v12c0 1.7 3.6 3 8 3s8-1.3 8-3V6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M4 12c0 1.7 3.6 3 8 3s8-1.3 8-3&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;66.6&quot; y=&quot;18&quot; dominant-baseline=&quot;middle&quot;&gt;Ledger&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g transform=&quot;translate(722 323)&quot;&gt;&lt;g&gt;&lt;rect width=&quot;160&quot; height=&quot;34&quot; rx=&quot;8&quot;&gt;&lt;/rect&gt;&lt;g transform=&quot;translate(31, 11) scale(0.5833333333333334)&quot;&gt;&lt;path d=&quot;M9 2v6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M15 2v6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M6 8h12v4a6 6 0 0 1-12 0z&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 18v4&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;text x=&quot;51&quot; y=&quot;18&quot; dominant-baseline=&quot;middle&quot;&gt;FraudCheck&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;figcaption&gt;Clients reach only what the Api lists. The aggregate, the policy, the projection and the external system stay inside, free to change.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The same Api can now be served to whoever needs it, through the same
middleware and rejections, so an agent can do exactly what a signed-in
client can and no more.&lt;/p&gt;
&lt;p&gt;As an HTTP JSON API with an OpenAPI document, with live reads as
Server-Sent Events, for partners, scripts and browsers
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2587&quot;&gt;#2587&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;BankHttp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DomainHttp&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHttpApi&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BankApi&lt;/span&gt;&lt;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;BankHttpLive&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;layer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BankHttp&lt;/span&gt;&lt;span&gt;.api&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;openapiPath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/openapi.json&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;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;BankHttp&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;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;BankLive&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;As an MCP server for agents, or as Effect AI tools for an agent inside your
app (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2586&quot;&gt;#2586&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;BankMcp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DomainAi&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMcp&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;BankApi&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;McpServer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;layerHttp&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;bank&quot;&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;1.0.0&quot;&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;/mcp&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;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;BankLive&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;As a command-line tool, for people and agents in a terminal
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2588&quot;&gt;#2588&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;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bank&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deposit-money&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;a-1&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;1000&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;reply&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;&quot;balance&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000&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;stream&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Account/a-1&quot;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;version&quot;:&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bank&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;withdraw-money&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;a-1&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;5000&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# exit code 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;&quot;_tag&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;InsufficientFunds&quot;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;balance&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;requested&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5000&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 as Foldkit commands and subscriptions for a web app
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2700&quot;&gt;#2700&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/domain/http-api&quot;&gt;HTTP API&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/mcp&quot;&gt;MCP&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/cli&quot;&gt;CLI&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/foldkit&quot;&gt;Foldkit&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;stories-run-real-adapters-and-show-what-went-wrong&quot;&gt;Stories run real adapters and show what went wrong&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A story tests a model as given, when, then. Stories now tell you exactly
what failed. A failing story prints every step, marked passed, failed or not
run, with the events committed so far
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2475&quot;&gt;#2475&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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clock&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;2026-03-01T09:00:00Z&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;given&lt;/span&gt;&lt;span&gt;(c1&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;Incremented&lt;/span&gt;&lt;span&gt;({ by&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; total&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(c1&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;Increment&lt;/span&gt;&lt;span&gt;({ by&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(c1&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;Incremented&lt;/span&gt;&lt;span&gt;({ by&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; total&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt; }))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replied&lt;/span&gt;&lt;span&gt;({ total&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;StoryFailure: Then: on Counter/c-1&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;&lt;/span&gt;&lt;span&gt;✓ 1 Clock      2026-03-01T09:00:00.000Z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✓ 2 Given      Counter/c-1: Incremented { by: 2, total: 2 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✓ 3 When       Counter/c-1: Increment { by: 3 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✗ 4 Then       Counter/c-1: expected Incremented { by: 4, total: 6 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;got      Incremented { by: 3, total: 5 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5 Replied    { total: 6 }&lt;/span&gt;&lt;/div&gt;&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 so far&lt;/span&gt;&lt;/div&gt;&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/c-1: Incremented → Incremented&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 story also fails on any event a command or policy committed that no step
asserts, on every stream, so a side effect can’t slip past it
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2551&quot;&gt;#2551&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;StoryFailure: committed events no step asserts (assert them with then):&lt;/span&gt;&lt;/div&gt;&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/c-1: Capped (from step 4)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Steps type-check against the last command, so a rejection it can’t return,
or a reply it doesn’t give, is a compile error instead of a failing run
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2559&quot;&gt;#2559&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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(c1&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;Increment&lt;/span&gt;&lt;span&gt;({ by&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rejected&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;NotAnOperator&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Type &apos;RejectedStep&amp;#x3C;NotAnOperator&gt;&apos; is not assignable to type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;//   &apos;&quot;Increment does not reject with NotAnOperator&quot;&apos;.&lt;/span&gt;&lt;/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;Time moves with &lt;code dir=&quot;auto&quot;&gt;Story.advance&lt;/code&gt;, and scheduled commands fire when they come
due (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2629&quot;&gt;#2629&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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(c1&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;Cap&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(c1&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;Capped&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;advance&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(c1&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;Reminded&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 scheduled reminder fired&lt;/span&gt;&lt;/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;Stories also changed how external systems are tested. Before, every
external system a story listed was scripted, and nothing outside the model
ran. Now you choose which systems to fake with &lt;code dir=&quot;auto&quot;&gt;stub&lt;/code&gt;, and the rest run for
real through the adapter Layers you provide
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2477&quot;&gt;#2477&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2481&quot;&gt;#2481&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Either way, every call is asserted. &lt;code dir=&quot;auto&quot;&gt;Story.call&lt;/code&gt; checks what the model sent,
and the next step settles how the call ended. For a stubbed system, that
step supplies the answer. For a real one, it checks the answer the adapter
gave:&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;// FraudCheck is stubbed: the story supplies its answer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;.score&lt;/span&gt;&lt;span&gt;,&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;account&lt;/span&gt;&lt;span&gt;.id&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;60_000&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Story&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;FraudCheck&lt;/span&gt;&lt;span&gt;.score&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { risk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.95&lt;/span&gt;&lt;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;// Payments runs for real: the story checks what the adapter returned&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;.refund&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { settlementId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;st_1&quot;&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;500&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;returned&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;.refund&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { refundId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;re_st_1&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;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Stubbed (&lt;code dir=&quot;auto&quot;&gt;stub: [...]&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Real (adapter Layer provided)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;what was sent&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.call&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;success&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.succeed&lt;/code&gt; supplies the value&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.returned&lt;/code&gt; asserts the value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;declared error&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.fail&lt;/code&gt; supplies it&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.failed&lt;/code&gt; asserts it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defect&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.die&lt;/code&gt; supplies it&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Story.died&lt;/code&gt; asserts it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A real call that no step asserts fails the story, so nothing an adapter does
goes unchecked. Supplied answers are checked against the operation’s schemas, like
a real adapter’s (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2548&quot;&gt;#2548&lt;/a&gt;),
and a story that leaves a system unstubbed requires its adapter Layer in its
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;story&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Story&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;Bank&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; &lt;/span&gt;&lt;span&gt;BankHandlers&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; stub&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;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;it&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;&quot;refunds through the real payments adapter&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; () &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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RecordSettlement&lt;/span&gt;&lt;span&gt;({ settlementId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;st_1&quot;&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;500&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;account&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SettlementOnClosedAccount&lt;/span&gt;&lt;span&gt;({ settlementId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;st_1&quot;&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;500&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;.refund&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { settlementId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;st_1&quot;&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;500&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;returned&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;.refund&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { refundId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;re_st_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;).&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;StripePayments&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// required: Payments isn&apos;t stubbed&lt;/span&gt;&lt;/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;h4 id=&quot;update-your-stories&quot;&gt;Update your stories&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Rename the options and steps:&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;story&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Story&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;Bank&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;BankHandlers&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;externalSystems&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stub&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Payments&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(account&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;WithdrawMoney&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;60_000&lt;/span&gt;&lt;span&gt; }))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;expectCall&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;.score&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;60_000&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;resolve&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;.score&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { risk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.95&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;FraudCheck&lt;/span&gt;&lt;span&gt;.score&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;60_000&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&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;FraudCheck&lt;/span&gt;&lt;span&gt;.score&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { risk&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.95&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Then fix what the stricter checks now catch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every call needs a &lt;code dir=&quot;auto&quot;&gt;Story.call&lt;/code&gt; step&lt;/strong&gt;, stubbed or real. Before, a bare &lt;code dir=&quot;auto&quot;&gt;resolve&lt;/code&gt; answered the only pending call; now each answer follows the &lt;code dir=&quot;auto&quot;&gt;call&lt;/code&gt; that checks what was sent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;List every system you want faked in &lt;code dir=&quot;auto&quot;&gt;stub&lt;/code&gt;.&lt;/strong&gt; A system left out runs for real, and the story’s type requires its adapter Layer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assert every committed event.&lt;/strong&gt; A story fails on events no &lt;code dir=&quot;auto&quot;&gt;then&lt;/code&gt; asserts, including ones a policy writes on other instances. Add a &lt;code dir=&quot;auto&quot;&gt;Story.then&lt;/code&gt; for each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Answer with values the schema accepts.&lt;/strong&gt; A stubbed answer the operation’s success schema rejects now fails the policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move the clock forward only.&lt;/strong&gt; A &lt;code dir=&quot;auto&quot;&gt;Story.clock&lt;/code&gt; earlier than the current time, or a string that isn’t a time, now fails the story (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2564&quot;&gt;#2564&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code dir=&quot;auto&quot;&gt;clientInProcess&lt;/code&gt; for Api tests.&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;CustomerApi.testClient&lt;/code&gt; is now &lt;code dir=&quot;auto&quot;&gt;CustomerApi.clientInProcess&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2550&quot;&gt;#2550&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/domain/story&quot;&gt;Story&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/testing-models#answer-outside-systems&quot;&gt;Answer outside systems&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/testing-models#assert-real-calls&quot;&gt;Assert real calls&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;gcp&quot;&gt;GCP&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;cloud-run-services-and-containers-redesigned&quot;&gt;Cloud Run services and containers, redesigned&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A Cloud Run service runs one or more containers in each instance. The first
takes requests, and the rest run beside it on &lt;code dir=&quot;auto&quot;&gt;localhost&lt;/code&gt;. Cloud Run in
Alchemy was rebuilt around that model. Any container can be an image or your
own Effect program, and a container lists or binds the ones it needs
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2644&quot;&gt;#2644&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2652&quot;&gt;#2652&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2654&quot;&gt;#2654&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2657&quot;&gt;#2657&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;one-container&quot;&gt;One container&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A service starts as a single image:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;alchemy.run.ts&lt;/span&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;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;GCP&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/gcp&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;Effect&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/Effect&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;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;MyApp&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;GCP&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;GCP&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proxy&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;GCP&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;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Proxy&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;template&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&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;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;us-docker.pkg.dev/cloudrun/container/hello&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;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ containerPort&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;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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; { url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proxy&lt;/span&gt;&lt;span&gt;.uri }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;h4 id=&quot;add-a-sidecar&quot;&gt;Add a sidecar&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.Run.Container&lt;/code&gt; declares a container as a resource. List it after the
first one, and &lt;code dir=&quot;auto&quot;&gt;dependsOn&lt;/code&gt; holds the proxy back until the cache passes its
startup probe:&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;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;GCP&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;Container&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;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;docker.io/library/redis:7-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;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6379&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;startupProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { tcpSocket&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proxy&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;GCP&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;Service&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Proxy&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;template&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&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;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;us-docker.pkg.dev/cloudrun/container/hello&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;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ containerPort&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;dependsOn&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;.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;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;/div&gt;&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;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;proxy&lt;/span&gt;&lt;span&gt;.uri }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/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 plain container spec works in the list too. Every container takes
&lt;code dir=&quot;auto&quot;&gt;startupProbe&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;livenessProbe&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;dependsOn&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;run-your-own-program&quot;&gt;Run your own program&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;Give the service &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; and an Effect, and Alchemy bundles your program into
the first container. An Effect service binds its sidecars instead of listing
them. &lt;code dir=&quot;auto&quot;&gt;bindPort&lt;/code&gt; adds the Cache to the revision, makes the service wait for
it, and returns its address:&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;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;GCP&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/gcp&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;Effect&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/Effect&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;HttpServerResponse&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/http/HttpServerResponse&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;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;GCP&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;Container&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;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;docker.io/library/redis:7-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;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6379&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;startupProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { tcpSocket&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;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;GCP&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;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;{ 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;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;GCP&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;bindPort&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;6379&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// cache.url === &quot;http://localhost:6379&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;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;h4 id=&quot;run-your-own-program-in-a-sidecar&quot;&gt;Run your own program in a sidecar&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A Container with &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; runs your Effect program in its own image. Its
methods become a typed client for whoever binds it, called over &lt;code dir=&quot;auto&quot;&gt;localhost&lt;/code&gt;,
streams included. A program Container binds sidecars of its own:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/worker.ts&lt;/span&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;GCP&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/gcp&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;Effect&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/Effect&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;Stream&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/Stream&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;HttpServerResponse&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/http/HttpServerResponse&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;Cache&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;./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;/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;Worker&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;GCP&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;Container&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Worker&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;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;{&lt;/span&gt;&lt;/div&gt;&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;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;startupProbe&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { httpGet&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;/health&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;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;GCP&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;bindPort&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;6379&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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;greet&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; 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;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;name&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;count&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;Stream&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;1&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;span&gt;3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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 service binds the Worker with &lt;code dir=&quot;auto&quot;&gt;bindContainer&lt;/code&gt; and calls its methods:&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;import&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./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;/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;GCP&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;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;{ 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;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;GCP&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;bindPort&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;6379&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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;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;GCP&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;bindContainer&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;/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;fetch&lt;/span&gt;&lt;span&gt;:&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;greet&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;sam&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;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;HttpServerResponse&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Bindings chain, so one revision now runs three containers and starts them in
order:&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;revision&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── start Cache  → TCP :6379&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── start Worker (dependsOn Cache)  → GET :3000/health&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── start Api    (dependsOn Worker) → GET :8080/health&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── Ready → traffic to Api&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 service that runs an image lists its containers; a service or Container
that runs your program binds them, which gives it a client and orders startup
for it.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp/compute/sidecars&quot;&gt;Sidecars&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/compute/cloud-run&quot;&gt;Cloud Run&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;call-private-cloud-run-services&quot;&gt;Call private Cloud Run services&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;InvokeService&lt;/code&gt; calls the methods of a private Cloud Run service, signed with
the caller’s ID token, with types taken from the service class
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2653&quot;&gt;#2653&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;Quotes&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;GCP&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;Service&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;Quotes&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;Quotes&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;// the IAM invoker check stays on&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;quote&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (symbol&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;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;symbol&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;42&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ticks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (symbol&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;Stream&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;41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;42&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;43&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// in another service&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;quotes&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;GCP&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;InvokeService&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Quotes&lt;/span&gt;&lt;span&gt;)&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;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;quotes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;GOOG&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;Pass an Effect RPC &lt;code dir=&quot;auto&quot;&gt;schema&lt;/code&gt; or an HttpApi &lt;code dir=&quot;auto&quot;&gt;api&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;InvokeService&lt;/code&gt; or
&lt;code dir=&quot;auto&quot;&gt;bindContainer&lt;/code&gt; for a client with typed errors, and serve it with
&lt;code dir=&quot;auto&quot;&gt;ServeRpc&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;ServeHttpApi&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2654&quot;&gt;#2654&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;tasks&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;GCP&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;InvokeService&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TaskBackend&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;TaskRpcs&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Effect&amp;#x3C;Task, TaskNotFound | …&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;task&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;tasks&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getTask&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;t1&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;A service that returns methods but turns off the invoker check fails to
deploy, so RPC methods are never public by accident.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp/apis/effect-rpc#call-it-from-another-service&quot;&gt;Call it from another service&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/gcp/apis/effect-rpc#run-it-as-a-sidecar&quot;&gt;Run it as a sidecar&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;connect-aws-and-gcp-without-keys&quot;&gt;Connect AWS and GCP without keys&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A GCP binding on a Lambda, ECS task, EC2 instance or App Runner service no
longer creates a service account key. The host’s IAM role impersonates the
service account through workload identity federation
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2648&quot;&gt;#2648&lt;/a&gt;). Your code
doesn’t 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;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;Worker&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; 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;publish&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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Publish&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;yield*&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;/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;publish&lt;/span&gt;&lt;span&gt;({ body&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { messages&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;btoa&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;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;as&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;published&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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PublishHttp&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;WorkerServiceAccount         GCP.IAM.ServiceAccount&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WorkerServiceAccountKey      GCP.IAM.ServiceAccountKey&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AwsWorkloadIdentityPool      GCP.IAM.WorkloadIdentityPool&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AwsWorkloadIdentityProvider  GCP.IAM.WorkloadIdentityProvider&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WorkerWorkloadIdentityUser   GCP.IAM.Member&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 other direction works the same way: Cloud Run and Cloud Functions assume
their AWS role with a Google ID token, with no IAM user or access key
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2645&quot;&gt;#2645&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;WorkloadIdentityPool&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;WorkloadIdentityProvider&lt;/code&gt; are resources too, for
keyless CI from GitHub Actions or any OIDC issuer
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2130&quot;&gt;#2130&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp/security/federated-identity&quot;&gt;GCP federated identity&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/aws/security/federated-identity&quot;&gt;AWS federated identity&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;migrations-on-cloud-sql-alloydb-and-spanner&quot;&gt;Migrations on Cloud SQL, AlloyDB and Spanner&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Every GCP SQL database applies &lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt; on deploy, like D1, Neon,
PlanetScale, Turso, RDS and DSQL
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2651&quot;&gt;#2651&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;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;GCP&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;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;div&gt;&lt;div&gt;&lt;span&gt;&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;instance&lt;/span&gt;&lt;span&gt;.instanceName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrationsUser&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;.userName&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrationsPassword&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;password&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Cloud SQL runs them over its data API by default, which needs no network
route, or through the Cloud SQL connector. Spanner resumes a failed
migration at the statement that failed. &lt;code dir=&quot;auto&quot;&gt;GCP.SQL.Instance&lt;/code&gt; can now be
private-IP only, with SSL mode and backup retention in the stack
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2642&quot;&gt;#2642&lt;/a&gt;), and Pub/Sub
subscriptions write straight into BigQuery
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2213&quot;&gt;#2213&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/duailibe&quot;&gt;Lucas Duailibe&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp/data/cloud-sql&quot;&gt;Cloud SQL&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;sign-in-with-gcloud&quot;&gt;Sign in with gcloud&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A GCP profile signs in through a named gcloud configuration, the way an AWS
profile uses &lt;code dir=&quot;auto&quot;&gt;aws sso login&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2635&quot;&gt;#2635&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2680&quot;&gt;#2680&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;gcloud&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;login&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--configuration=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;--add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GCP&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;gcloud&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;configuration=work&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 profile edit --add GCP&lt;/code&gt; lists your configurations, or creates one
and opens the browser. Each run asks gcloud for a fresh token, and nothing is
copied into the profile. Signed in as yourself, you can also create projects
without an organization or folder
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2616&quot;&gt;#2616&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp/setup#credentials&quot;&gt;GCP credentials&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;custom-domains-with-any-dns-provider&quot;&gt;Custom domains with any DNS provider&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A custom domain’s DNS no longer has to live with the platform that serves
it. &lt;code dir=&quot;auto&quot;&gt;domain.dns&lt;/code&gt; names the DNS provider that holds the records, on every
platform (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1888&quot;&gt;#1888&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;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;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/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;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;api.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;dns&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;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Adapter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Worker&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;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/web.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;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;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;span&gt;zoneId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;saasZone&lt;/span&gt;&lt;span&gt;.zoneId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cnameTarget&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fallback&lt;/span&gt;&lt;span&gt;.origin&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Route53&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Adapter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;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;Vite&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;/div&gt;&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;docs.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;dns&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;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Adapter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Alchemy publishes whatever the platform asks for: certificate validation
records, ACME challenges, verification TXTs and aliases. Cloudflare, Route
53 and Hetzner adapters ship today, and an adapter for another DNS provider
is three functions. Thanks &lt;a href=&quot;https://github.com/dan-myles&quot;&gt;Dan Myles&lt;/a&gt; and
&lt;a href=&quot;https://github.com/bjorntechTobbe&quot;&gt;bjorntechTobbe&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-code/dns-adapters&quot;&gt;DNS adapters&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflare-state-store-v8&quot;&gt;Cloudflare State Store v8&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Cloudflare state store is now deployed with direct API calls instead of a
stack, as state store v8, and you choose its Worker name, account and domain
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2385&quot;&gt;#2385&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;choose-the-worker-name&quot;&gt;Choose the Worker name&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;workerName&lt;/code&gt; sets the store’s Worker name. Without it, you get the same default
store as before:&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;state&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;state&lt;/span&gt;&lt;span&gt;({ workerName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;team-a-state&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 replaces &lt;code dir=&quot;auto&quot;&gt;name&lt;/code&gt;, which prefixed the Worker name with &lt;code dir=&quot;auto&quot;&gt;alchemy-state-store-&lt;/code&gt;.
A store you named that way keeps its Worker and secrets when you pass the full
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;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;MyApp&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;providers&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;providers&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;state&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;team-a&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;state&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;state&lt;/span&gt;&lt;span&gt;({ workerName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;alchemy-state-store-team-a&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;span&gt;,&lt;/span&gt;&lt;/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;--name&lt;/code&gt; takes the Worker name too:&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;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&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;cloudflare&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;alchemy-state-store-team-a&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;pin-the-account-and-serve-it-on-your-domain&quot;&gt;Pin the account and serve it on your domain&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Pin the account so a login against another one can’t read or deploy the store
there, and serve it on a hostname in one of your zones for networks that can’t
reach &lt;code dir=&quot;auto&quot;&gt;workers.dev&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;state&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;state&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;&quot;c8eeff0e...&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;alchemy-state.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;h3 id=&quot;upgrade-from-v7&quot;&gt;Upgrade from v7&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Your next &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; asks to upgrade the store. In CI, pass &lt;code dir=&quot;auto&quot;&gt;--yes&lt;/code&gt;, or
upgrade it ahead of time:&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;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bootstrap&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 upgrade keeps the store’s auth token, encryption key and state, and only
ever creates a secret that’s missing, so a deploy can’t rotate the token or
replace the key. A store that has lost its key isn’t given a new one unless you
confirm.&lt;/p&gt;
&lt;aside aria-label=&quot;Danger&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Danger&lt;/p&gt;&lt;div&gt;&lt;p&gt;The upgrade deletes the &lt;code dir=&quot;auto&quot;&gt;CloudflareStateStore&lt;/code&gt; stack that beta.84 and earlier
use to manage the store. Don’t run an older Alchemy against the store after
upgrading: it can no longer manage it, and you risk losing the encryption key,
which nothing can recover. Upgrade every machine and CI job that uses the store
together.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/state-store#cloudflare-state-store&quot;&gt;Cloudflare state store&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/state-store#more-than-one-store-per-account&quot;&gt;More than one store&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;aws-state-now-uses-dynamodb-and-plans-270-faster&quot;&gt;AWS state now uses DynamoDB and plans 270× faster&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.state()&lt;/code&gt; keeps state in one on-demand DynamoDB table per account and
region, and a deploy loads the stage with one &lt;code dir=&quot;auto&quot;&gt;Query&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2683&quot;&gt;#2683&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2691&quot;&gt;#2691&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S3&lt;/th&gt;
&lt;th&gt;DynamoDB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;plan, 250 resources&lt;/td&gt;
&lt;td&gt;21.6 s&lt;/td&gt;
&lt;td&gt;0.08 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unchanged redeploy, 1,000 resources&lt;/td&gt;
&lt;td&gt;195 s&lt;/td&gt;
&lt;td&gt;0.5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;destroy, 1,000 resources&lt;/td&gt;
&lt;td&gt;162 s&lt;/td&gt;
&lt;td&gt;12.5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Existing stages move with one command. Older Alchemy versions are fenced
out of the S3 copy, and nothing in S3 is deleted:&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;alchemy&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;migrate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;my-app/prod:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrated&lt;/span&gt;&lt;span&gt; (42 &lt;/span&gt;&lt;span&gt;records&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; &lt;/span&gt;&lt;span&gt;alchemy&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;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rollback&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# back to S3, before downgrading&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/state-store#aws-state-store&quot;&gt;AWS state store&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/state-store#migrating-from-the-s3-store&quot;&gt;Migrating from S3&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemist-the-alchemy-cli-as-a-programmatic-api&quot;&gt;Alchemist: the Alchemy CLI as a programmatic API&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt; CLI is now a thin layer over &lt;code dir=&quot;auto&quot;&gt;alchemy/Alchemist&lt;/code&gt;. Everything
it does (plan, apply, drift, nuke, logs, state) is one call you can make from
your own program, and every step is a typed event you can handle
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2765&quot;&gt;#2765&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;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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;program&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;plan&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;Alchemist&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;plan&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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;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;&lt;/span&gt;&lt;span&gt;operation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;deploy&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;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;/div&gt;&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;if&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;hasChanges&lt;/span&gt;&lt;span&gt;(plan)) &lt;/span&gt;&lt;span&gt;yield*&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;apply&lt;/span&gt;&lt;span&gt;(plan)&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;scan&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;Alchemist&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Drift&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;scan&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;Stack&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;span&gt;  &lt;/span&gt;&lt;span&gt;if&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;Drift&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;hasDrift&lt;/span&gt;&lt;span&gt;(scan)) &lt;/span&gt;&lt;span&gt;yield*&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;Drift&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(scan)&lt;/span&gt;&lt;span&gt;;&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;Alchemist&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onEvent&lt;/span&gt;&lt;span&gt;((event) &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;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;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;Alchemist&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;,&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;.scoped&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Build your own CLI, a deploy bot or a CI step on the same API the &lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt;
command uses. Every run also writes one NDJSON log under &lt;code dir=&quot;auto&quot;&gt;.alchemy/log/&lt;/code&gt;,
child processes and sidecars included. Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cli/api&quot;&gt;CLI API&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alchemyruntest-a-test-runner-for-effect&quot;&gt;@alchemy.run/test: a test runner for Effect&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy’s own test runner is now on npm as &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/test&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2452&quot;&gt;#2452&lt;/a&gt;). It is small
and built only for Effect: tests are Effects, and every test file runs in
one bun process, with files and tests in flight at once.&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;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pkg.alchemy.run/@alchemy.run/test/pr:2930:a10573e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;effect&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;bunx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alchemy-test&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;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;describe&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;expect&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;it&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/test&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;Effect&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/Effect&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;charge&lt;/span&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; number&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;(amount &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;402&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;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;describe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Checkout&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;live&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;charges the card&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; () &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;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;&quot;POST /charges { amount: 9000 }&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;status&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;charge&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;9000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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; (status &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;) {&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;logError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`payment provider returned ${&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;;&lt;/span&gt;&lt;/div&gt;&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;expect&lt;/span&gt;&lt;span&gt;(status).&lt;/span&gt;&lt;span&gt;toBe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;It prints one line per test as it finishes, with a running count, so you can
follow a long run as it goes. Each test’s stdout and stderr are buffered on
their own. A passing test’s output stays quiet; a failing test prints its
error and its output at once, in one piece, never interleaved with tests
running beside it. The last line links one log file holding every test’s
output, passes included:&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;running 4 tests from 1 files&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;[1/4 ✓1 ✗0] ✓ test/Checkout.test.ts &gt; Checkout &gt; adds an item to the cart (1ms)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[2/4 ✓2 ✗0] ✓ test/Checkout.test.ts &gt; Checkout &gt; applies a discount (151ms)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[3/4 ✓2 ✗1] ✗ test/Checkout.test.ts &gt; Checkout &gt; charges the card (0ms)&lt;/span&gt;&lt;/div&gt;&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 402 to be 200&lt;/span&gt;&lt;/div&gt;&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 &amp;#x3C;anonymous&gt; (test/Checkout.test.ts:21:42)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--- captured output ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;POST /charges { amount: 9000 }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;payment provider returned 402&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;--- end output ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[4/4 ✓3 ✗1] ✓ test/Checkout.test.ts &gt; Checkout &gt; sends a receipt (82ms)&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;Tests: 1 failed | 3 passed (1 files, 250ms)&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-11-02T19-02-29-pid37920.log (2.6 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;That last line is there for agents. An agent running the suite reads the
log to see what happened in any test, without piping output to a file or
running the tests again. When nothing finishes for 10 s, the runner lists
the tests still running and how long each has taken, so a hang names
itself.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;--stage &amp;#x3C;name&gt;&lt;/code&gt; gives each git worktree its own stage, so agents in
parallel worktrees test against one cloud account without colliding
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2613&quot;&gt;#2613&lt;/a&gt;). &lt;code dir=&quot;auto&quot;&gt;Test.make&lt;/code&gt;,
which deploys a stack for a test file, lives in the same package and
works with &lt;code dir=&quot;auto&quot;&gt;bun test&lt;/code&gt; and Vitest too.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/testing/test-harness&quot;&gt;Test harness&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/environments/worktrees&quot;&gt;Worktrees&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;lambda-aliases-streaming-and-partial-batch-failures&quot;&gt;Lambda aliases, streaming and partial batch failures&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alias&lt;/code&gt; publishes a version on each deploy and routes every event source,
URL and integration through it, so a rollback is one &lt;code dir=&quot;auto&quot;&gt;update-alias&lt;/code&gt; call
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2504&quot;&gt;#2504&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;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; alias&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;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;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;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; &lt;/span&gt;&lt;span&gt;processJob&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// → api:live&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;handleHttp&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 on qualifier &quot;live&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;})&lt;/span&gt;&lt;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;SQS, Kinesis and DynamoDB Streams handlers receive the Lambda event and can
return its batch response, so only the failed records are retried
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2508&quot;&gt;#2508&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;SQS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeQueueMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&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;Effect&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;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Records&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (record) &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;handle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;record&lt;/span&gt;&lt;span&gt;.body).&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;as&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;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;catchCause&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;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;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;batchItemFailures&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((r) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; ({ itemIdentifier&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;.messageId }))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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 &lt;code dir=&quot;auto&quot;&gt;RESPONSE_STREAM&lt;/code&gt; Function URL streams an Effect response body instead of
buffering it (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2502&quot;&gt;#2502&lt;/a&gt;), and
a handler that runs past its &lt;code dir=&quot;auto&quot;&gt;timeout&lt;/code&gt; is interrupted, so finalizers run and
telemetry flushes before Lambda kills the sandbox
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2682&quot;&gt;#2682&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;timeout&lt;/span&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;seconds&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;span&gt; &lt;/span&gt;&lt;span&gt;// handler interrupted at 30 s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;timeoutMargin&lt;/span&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;seconds&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;span&gt; &lt;/span&gt;&lt;span&gt;// Lambda configured for 32 s&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/lambda&quot;&gt;Lambda&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;95-bug-fixes&quot;&gt;95 bug fixes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Most of this release is fixes, many found by new test suites rather than by
users. About 900 provider failures that were a plain &lt;code dir=&quot;auto&quot;&gt;Error&lt;/code&gt; are now tagged
errors you can catch (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2711&quot;&gt;#2711&lt;/a&gt;),
and ECR images hash only what &lt;code dir=&quot;auto&quot;&gt;.dockerignore&lt;/code&gt; keeps, so hashing a large repo
dropped from 344 s to 8 s
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2351&quot;&gt;#2351&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;one-conformance-suite-for-every-workflow-engine&quot;&gt;One conformance suite for every workflow engine&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Every &lt;code dir=&quot;auto&quot;&gt;WorkflowEngine&lt;/code&gt; implementation now runs the same 28-case conformance
suite: the Durable Object engine, Cloudflare Workflows and Lambda durable
functions (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2916&quot;&gt;#2916&lt;/a&gt;). The
cases cover results, idempotent starts, durable sleeps, signals,
compensations, defects, retries, interrupts and child workflows. The suite
found 12 of the 15 engine bugs fixed in this release, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sleeps ran later on every hop, because wake-ups inherited the Durable
Object alarm’s retry backoff. Four one-second sleeps took over 45 s; they
now take about 4 s.&lt;/li&gt;
&lt;li&gt;A repeated or late signal hung for three minutes, then died.&lt;/li&gt;
&lt;li&gt;An interrupt sent right after start was dropped, or stopped the run without
running its compensations.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Activity.retry&lt;/code&gt; saw attempt 1 on every retry.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Activity.raceAll&lt;/code&gt; hung forever on the two engines that can’t support it;
it now fails at once and points to the Durable Object engine.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;drift-only-reports-real-changes&quot;&gt;Drift only reports real changes&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy drift&lt;/code&gt; now sees every setting that Lambda, DynamoDB, S3, SQS,
EventBridge, Step Functions, WAF, ELB, ECS and EC2 networking manage, so a
change made in the console shows up
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2661&quot;&gt;#2661&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2705&quot;&gt;#2705&lt;/a&gt;). Untouched
resources no longer show up as drifted
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2496&quot;&gt;#2496&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2169&quot;&gt;#2169&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2647&quot;&gt;#2647&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;$&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;deploy&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;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;drift&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Api] drifted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[Db] drifted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Plan:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;no&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;changes&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;--repair&lt;/code&gt; recreates deleted resources in dependency order
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2495&quot;&gt;#2495&lt;/a&gt;), and EC2 creates
are idempotent, so a retry never launches a second instance
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2598&quot;&gt;#2598&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/DivMode&quot;&gt;DivMode&lt;/a&gt;,
&lt;a href=&quot;https://github.com/gjermundgaraba&quot;&gt;Gjermund Garaba&lt;/a&gt; and
&lt;a href=&quot;https://github.com/ahmedhesham6&quot;&gt;Ahmed Hesham&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;deploys-never-take-over-a-resource-they-dont-own&quot;&gt;Deploys never take over a resource they don’t own&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A resource in a dependency cycle checks ownership before it’s created, so
it can’t overwrite a Worker or Lambda someone else owns
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2195&quot;&gt;#2195&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2620&quot;&gt;#2620&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;A replacement is refused before it touches anything when its new name
belongs to someone else (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2200&quot;&gt;#2200&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Recovering an interrupted create never deletes a same-named resource by
guessing (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2199&quot;&gt;#2199&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2534&quot;&gt;#2534&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;A ref to a resource in the same stack is a dependency, so destroy no longer
races it (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2913&quot;&gt;#2913&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy destroy&lt;/code&gt; plans from state without running your program, so a dev
stage tears down without cloud credentials
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2491&quot;&gt;#2491&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks &lt;a href=&quot;https://github.com/NachoVazquez&quot;&gt;Nacho Vazquez&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;cloudflare&quot;&gt;Cloudflare&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A secret removed from a Worker’s &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; is unbound instead of staying live
forever (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2327&quot;&gt;#2327&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;forceDestroy&lt;/code&gt; deletes an R2 bucket holding unfinished multipart uploads
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2537&quot;&gt;#2537&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;A new container-backed Durable Object deploys in one pass, and a
local-only Container image works
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2342&quot;&gt;#2342&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2922&quot;&gt;#2922&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Preview Workers keep &lt;code dir=&quot;auto&quot;&gt;json&lt;/code&gt; bindings and JWKs as written
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2127&quot;&gt;#2127&lt;/a&gt;), and two async
Workers can bind each other (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2681&quot;&gt;#2681&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The login picker lists every account, not the first 20
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2902&quot;&gt;#2902&lt;/a&gt;), and a Secrets
Store with more than 20 secrets finds them
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2443&quot;&gt;#2443&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks &lt;a href=&quot;https://github.com/pattobrien&quot;&gt;Patt O’Brien&lt;/a&gt;,
&lt;a href=&quot;https://github.com/drwpwrs&quot;&gt;Drew Powers&lt;/a&gt;,
&lt;a href=&quot;https://github.com/andoni-enriquez&quot;&gt;Andoni Enriquez&lt;/a&gt; and
&lt;a href=&quot;https://github.com/harrysolovay&quot;&gt;Harry Solovay&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;local-dev&quot;&gt;Local dev&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A Vite app with &lt;code dir=&quot;auto&quot;&gt;publicDir: false&lt;/code&gt; no longer serves files from your
machine through &lt;code dir=&quot;auto&quot;&gt;ASSETS&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2615&quot;&gt;#2615&lt;/a&gt;),
and the Bun RPC sidecar listens on loopback only
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2845&quot;&gt;#2845&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Vite plugins and &lt;code dir=&quot;auto&quot;&gt;server.proxy&lt;/code&gt; keep their own WebSockets
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2516&quot;&gt;#2516&lt;/a&gt;), and large
responses behind a local reverse proxy aren’t truncated
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2841&quot;&gt;#2841&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs on NixOS with &lt;code dir=&quot;auto&quot;&gt;dev.workerd&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;ALCHEMY_WORKERD_PATH&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2791&quot;&gt;#2791&lt;/a&gt;), and Docker is
contacted only for Workers with containers
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2784&quot;&gt;#2784&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Concurrent processes on one OAuth profile no longer revoke it
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1923&quot;&gt;#1923&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks &lt;a href=&quot;https://github.com/xiaoyu2er&quot;&gt;Yanqi Zong&lt;/a&gt; and
&lt;a href=&quot;https://github.com/birbprophet&quot;&gt;0xMilkEnjoyer&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;p&gt;&lt;strong&gt;Alchemy Domain&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Aggregate.predict&lt;/code&gt; runs a command’s rules on the client, so a UI shows the outcome before the server answers (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2568&quot;&gt;#2568&lt;/a&gt;), and &lt;code dir=&quot;auto&quot;&gt;View.snapshot&lt;/code&gt; returns state with the cursor to follow it live from (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2567&quot;&gt;#2567&lt;/a&gt;). &lt;a href=&quot;https://alchemy.run/domain/optimistic-updates&quot;&gt;Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Views, projections and policies can be keyed by a Schema value instead of an aggregate (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2554&quot;&gt;#2554&lt;/a&gt;), and a scheduled command can be cancelled with &lt;code dir=&quot;auto&quot;&gt;unschedule&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2547&quot;&gt;#2547&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;External system calls are checked against their schemas, and an operation can declare several errors (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2548&quot;&gt;#2548&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2553&quot;&gt;#2553&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;codeUpdateStrategy&lt;/code&gt; sets how running Durable Objects move onto new code (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2863&quot;&gt;#2863&lt;/a&gt;). &lt;a href=&quot;https://alchemy.run/cloudflare/compute/code-updates&quot;&gt;Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Workers import any file through &lt;code dir=&quot;auto&quot;&gt;rules&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2792&quot;&gt;#2792&lt;/a&gt;), and Flagship flags evaluate locally in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2746&quot;&gt;#2746&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;consumeNotifications&lt;/code&gt; handles Cloudflare alerts in code, and Effect logs reach Workers Logs at their own level (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2519&quot;&gt;#2519&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Workflows, Queues and R2 buckets take a &lt;code dir=&quot;auto&quot;&gt;jurisdiction&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2734&quot;&gt;#2734&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2538&quot;&gt;#2538&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2758&quot;&gt;#2758&lt;/a&gt;), and Email Routing takes subdomains and subaddressing (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2762&quot;&gt;#2762&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller runtime bundles: a Lambda ships 0.51 MB instead of 1.30 MB, minified with source maps (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2492&quot;&gt;#2492&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;EventBridge.Endpoint&lt;/code&gt; global endpoints, regional NAT gateways, and Auto Scaling by instance attributes (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2507&quot;&gt;#2507&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2498&quot;&gt;#2498&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2817&quot;&gt;#2817&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tooling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker builds take args and BuildKit secrets, and &lt;code dir=&quot;auto&quot;&gt;Docker.Container&lt;/code&gt; takes hardening options (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2225&quot;&gt;#2225&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2623&quot;&gt;#2623&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Drizzle 1.0 rc.5 asks rename-or-create questions during plan (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2433&quot;&gt;#2433&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;Command.Dev&lt;/code&gt; takes a &lt;code dir=&quot;auto&quot;&gt;port&lt;/code&gt; or waits for its URL (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2750&quot;&gt;#2750&lt;/a&gt;). &lt;a href=&quot;https://alchemy.run/cli/dev&quot;&gt;Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A stack can declare its stages, so a misspelled stage is a type error (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2131&quot;&gt;#2131&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta85&quot;&gt;CHANGELOG&lt;/a&gt; for every other change, and thanks to everyone who contributed.&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/domain&quot;&gt;Alchemy Domain&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/backfill&quot;&gt;Backfill&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/http-api&quot;&gt;HTTP API&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/mcp&quot;&gt;MCP&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/cli&quot;&gt;CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/gcp/compute/cloud-run&quot;&gt;Cloud Run&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/compute/sidecars&quot;&gt;Sidecars&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/security/federated-identity&quot;&gt;GCP federated identity&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/setup#credentials&quot;&gt;GCP credentials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/infrastructure-as-code/dns-adapters&quot;&gt;DNS adapters&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/state-store&quot;&gt;State stores&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/compute/lambda&quot;&gt;Lambda&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cli/api&quot;&gt;CLI API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/compare/v2.0.0-beta.84...v2.0.0-beta.85&quot;&gt;Compare v2.0.0-beta.84 → v2.0.0-beta.85&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Hillclimbing distilled</title><link>https://alchemy.run/blog/2026-10-24-optimizing-distilled/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-10-24-optimizing-distilled/</guid><description>We asked an agent for a benchmark dashboard, then kept pushing it to drive every number on it lower. The result is 123 commits that cut distilled&apos;s bundles by a third, its added latency by four fifths and its import memory by three quarters. Distilled now adds 5 to 109 times less latency per call than the official AWS, Cloudflare and GCP SDKs, and stays ahead with every response validated.</description><pubDate>Sat, 24 Oct 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every Alchemy resource talks to its cloud through
&lt;a href=&quot;https://distilled.cloud&quot;&gt;distilled&lt;/a&gt;, our Effect-native SDKs covering
88 providers. Bindings use it too: under the hood, a binding makes HTTP
calls to the cloud’s API, so every Worker or Lambda with a binding
bundles distilled.&lt;/p&gt;
&lt;p&gt;That puts distilled’s size in every deploy and every bundle, and until
recently it was heavy: one API call bundled to 57 KB, and importing all
of AWS took 227 MB of memory.&lt;/p&gt;
&lt;p&gt;So we hillclimbed it. We built a benchmark for every SDK, put it on a
dashboard, and pointed an agent at it with one job: make every number
go down. It ran the benchmark after every change, kept what helped and
dropped what didn’t. Over 123 commits and 84 benchmark runs, a
single call’s bundle shrank by a third and
importing all of AWS went from 227 MB to 13.9 MB.&lt;/p&gt;
&lt;p&gt;Distilled today vs distilled before this work&lt;/p&gt;&lt;ul data-nosnippet=&quot;&quot;&gt;&lt;li&gt;&lt;span&gt;−33%&lt;/span&gt;&lt;span&gt;bundle size&lt;/span&gt;&lt;span&gt;57.1 → 38.3 KB gzip&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;−79%&lt;/span&gt;&lt;span&gt;added latency per call&lt;/span&gt;&lt;span&gt;19.5 → 4.0 µs&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;−74%&lt;/span&gt;&lt;span&gt;import memory&lt;/span&gt;&lt;span&gt;2.15 → 0.57 MB&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;16×&lt;/span&gt;&lt;span&gt;less memory to import all of AWS&lt;/span&gt;&lt;span&gt;227 → 13.9 MB&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;These are medians over 98 “programs”: one credentials layer plus one
operation, for every SDK and every wire protocol it uses. Here is how
that compares with the official SDKs today:&lt;/p&gt;
&lt;figure aria-label=&quot;Distilled compared with the official AWS, Cloudflare and GCP SDKs&quot;&gt;&lt;figcaption&gt;Distilled vs the official SDKs&lt;/figcaption&gt;&lt;div&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;official SDK&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;distilled&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;b&gt;AWS SDK v3&lt;/b&gt;&lt;span&gt;6 calls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;cloudflare&lt;/b&gt;&lt;span&gt;workers.scripts.list&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;@google-cloud/storage&lt;/b&gt;&lt;span&gt;getBuckets&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Bundle size&lt;/div&gt;&lt;div title=&quot;AWS SDK v3: 143.1 KB · distilled: 55.1 KB&quot;&gt;&lt;span&gt;Bundle size&lt;/span&gt;&lt;span&gt;2.6×&lt;/span&gt;&lt;span&gt;smaller&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;cloudflare: 124.5 KB · distilled: 55.8 KB&quot;&gt;&lt;span&gt;Bundle size&lt;/span&gt;&lt;span&gt;2.2×&lt;/span&gt;&lt;span&gt;smaller&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;@google-cloud/storage: 239.1 KB · distilled: 39.7 KB&quot;&gt;&lt;span&gt;Bundle size&lt;/span&gt;&lt;span&gt;6.0×&lt;/span&gt;&lt;span&gt;smaller&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Added latency&lt;/div&gt;&lt;div title=&quot;AWS SDK v3: 90.2 µs · distilled: 15.7 µs&quot;&gt;&lt;span&gt;Added latency&lt;/span&gt;&lt;span&gt;5.8×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;cloudflare: 15.5 µs · distilled: 3.0 µs&quot;&gt;&lt;span&gt;Added latency&lt;/span&gt;&lt;span&gt;5.1×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;@google-cloud/storage: 673.9 µs · distilled: 6.2 µs&quot;&gt;&lt;span&gt;Added latency&lt;/span&gt;&lt;span&gt;108.9×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Import memory&lt;/div&gt;&lt;div title=&quot;AWS SDK v3: 3.41 MB · distilled: 1.03 MB&quot;&gt;&lt;span&gt;Import memory&lt;/span&gt;&lt;span&gt;3.3×&lt;/span&gt;&lt;span&gt;less&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;cloudflare: 15.31 MB · distilled: 0.65 MB&quot;&gt;&lt;span&gt;Import memory&lt;/span&gt;&lt;span&gt;23.5×&lt;/span&gt;&lt;span&gt;less&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;@google-cloud/storage: 5.14 MB · distilled: 0.69 MB&quot;&gt;&lt;span&gt;Import memory&lt;/span&gt;&lt;span&gt;7.5×&lt;/span&gt;&lt;span&gt;less&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Cold start&lt;/div&gt;&lt;div title=&quot;AWS SDK v3: 33.6 ms · distilled: 16.8 ms&quot;&gt;&lt;span&gt;Cold start&lt;/span&gt;&lt;span&gt;2.0×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;cloudflare: 48.9 ms · distilled: 16.3 ms&quot;&gt;&lt;span&gt;Cold start&lt;/span&gt;&lt;span&gt;3.0×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div title=&quot;@google-cloud/storage: 21.0 ms · distilled: 18.2 ms&quot;&gt;&lt;span&gt;Cold start&lt;/span&gt;&lt;span&gt;1.2×&lt;/span&gt;&lt;span&gt;faster&lt;/span&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Distilled compared with each official SDK, same call on both sides. Hover a cell for the numbers. Cold start is import plus the first call in a fresh process, bundled as deployed.&lt;/p&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h2 id=&quot;how-we-kept-score&quot;&gt;How we kept score&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We can’t make AWS or Cloudflare faster, only the SDK in front of them,
so real API calls would only add noise. Effect helps here: every
distilled request goes through the &lt;code dir=&quot;auto&quot;&gt;HttpClient&lt;/code&gt; service, so the
benchmark swaps in a fake one that answers instantly:&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;MockHttp&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;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;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;HttpClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&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;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;HttpClientResponse&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fromWeb&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;new&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;canned&lt;/span&gt;&lt;span&gt;.body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; canned))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;That leaves only distilled’s own cost: bundle size, added latency per
call, import memory and a few more. Each one is measured twice. The
second time turns on &lt;strong&gt;strict mode&lt;/strong&gt;, where distilled checks every
response against the API spec before your code sees it, so a missing
or mistyped field fails right away as a typed error. Strict mode costs
time and bytes, so it gets its own dotted line on the charts.&lt;/p&gt;
&lt;p&gt;Of all those numbers, memory mattered most to us. It matters for your
Workers and Lambdas, but it also limits how we build Alchemy itself.
Our &lt;a href=&quot;https://alchemy.run/blog/2026-07-02-cloudflare-resource-factory&quot;&gt;resource factory&lt;/a&gt;
runs many agents at once, and each one type-checks, imports every
provider and runs live tests. On our machines memory runs out before
CPU does, so halving the heap lets us run about twice as many agents.&lt;/p&gt;
&lt;p&gt;Every run lands on a dashboard that lives in the distilled repo, one
dot per commit, so each chart reads like a loss curve. The benchmarks
now run on every distilled PR too, so a regression shows up before it
merges.&lt;/p&gt;
&lt;p&gt;The whole project came down to one dashboard and one chat thread. With
every change on a chart, we could follow the work without reading a
single diff. Our job became checking in every 30 minutes or so: is it
still on track, and are the changes extreme enough? They often
weren’t. The rest of this post climbs from the fixes any reviewer
would approve to the ones that only happened because we kept telling
the agent to get weirder.&lt;/p&gt;
&lt;p&gt;How we said it mattered. The louder and stranger our messages got,
the bolder the ideas the agent came back with. Each section below
opens with a real message from the thread, typos included.&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Runtime memory&lt;/span&gt;&lt;span&gt; · median per program · lower is better&lt;/span&gt;&lt;span&gt;Import heap: V8 heapUsed after importing the SDK modules, minus before (fresh Node, Effect preloaded).&lt;/span&gt;&lt;/figcaption&gt;&lt;div&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;normal&lt;/span&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;strict&lt;/span&gt;&lt;/div&gt;&lt;svg viewBox=&quot;0 0 560 320&quot; role=&quot;img&quot;&gt;&lt;defs&gt;&lt;clipPath id=&quot;bench-clip-11&quot;&gt;&lt;rect x=&quot;86&quot; y=&quot;16&quot; width=&quot;458&quot; height=&quot;246&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;rect x=&quot;215.43478260869566&quot; y=&quot;22&quot; width=&quot;328.5652173913044&quot; height=&quot;234&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;221.43478260869566&quot; y=&quot;15&quot;&gt;this work →&lt;/text&gt;&lt;text x=&quot;209.43478260869566&quot; y=&quot;15&quot; text-anchor=&quot;end&quot;&gt;← before&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;256&quot; y2=&quot;256&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;260&quot; text-anchor=&quot;end&quot;&gt;0 B&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;178&quot; y2=&quot;178&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;182&quot; text-anchor=&quot;end&quot;&gt;1.00 MB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;100&quot; y2=&quot;100&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;104&quot; text-anchor=&quot;end&quot;&gt;2.00 MB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;26&quot; text-anchor=&quot;end&quot;&gt;3.00 MB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-11)&quot; points=&quot;210.5,87.0 409.6,189.2 419.5,187.8 429.5,192.0 439.5,192.0 449.4,189.9 459.4,187.6 469.3,191.9 479.3,199.4 489.2,206.5 499.2,206.5 509.2,206.1 519.1,206.8 529.1,206.9 539.0,211.1&quot;&gt;&lt;/polyline&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;227.127848&quot; text-anchor=&quot;end&quot;&gt;strict 575.3 KB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-11)&quot; points=&quot;91.0,48.8 100.9,45.2 110.9,41.8 120.8,41.8 130.8,41.8 140.8,56.2 150.7,87.2 160.7,92.1 170.6,88.9 180.6,93.6 190.5,92.5 200.5,87.2 210.5,88.1 220.4,87.8 230.4,103.6 240.3,104.7 250.3,111.4 260.2,117.6 270.2,118.2 280.2,122.5 290.1,135.0 300.1,144.7 310.0,144.3 320.0,144.2 329.9,147.2 339.9,147.8 349.8,151.9 359.8,166.2 369.8,168.5 379.7,183.0 389.7,182.4 399.6,192.3 409.6,193.5 419.5,191.3 429.5,192.8 439.5,192.5 449.4,190.5 459.4,192.5 469.3,188.7 479.3,199.2 489.2,206.7 499.2,207.0 509.2,206.0 519.1,206.6 529.1,207.5 539.0,211.8&quot;&gt;&lt;/polyline&gt;&lt;circle cx=&quot;140.8&quot; cy=&quot;56.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#6 751b30b7f feat(celld): add generated v0.6.0 SDK (#621): 2.56 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;150.7&quot; cy=&quot;87.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#7 1f4a62973 fix(aws,cloudflare): type Workers preview conflict and Deadline UpdateQueue conflict (#683): 2.16 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;230.4&quot; cy=&quot;103.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#15 f7bf885c1 perf(core): read the retry hint cap without effect/Config: 1.95 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;250.3&quot; cy=&quot;111.4&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#17 9e6000975 perf(core): share operation methods through one prototype: 1.85 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;260.2&quot; cy=&quot;117.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#18 be75448c1 chore: apply the nested PURE markers to every generated service: 1.77 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;280.2&quot; cy=&quot;122.5&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#20 b2297ea0a perf(core): build Array and Record schemas lazily too: 1.71 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;290.1&quot; cy=&quot;135.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#21 b5b1c83e8 chore: apply the Latin-1 pass to every generated service: 1.55 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;300.1&quot; cy=&quot;144.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#22 c5ca2e97c perf: keep hand-written shipped sources Latin-1 only: 1.43 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;349.8&quot; cy=&quot;151.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#27 329034941 perf: strip JSDoc from compiled JavaScript: 1.33 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;359.8&quot; cy=&quot;166.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#28 1bc789950 chore: privatize schemas in every generated service: 1.15 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;379.7&quot; cy=&quot;183.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#30 d2d5f33cd chore: table private schemas in every generated service: 936.0 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;399.6&quot; cy=&quot;192.3&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#32 c0e8b9d81 perf: mark top-level calls in hand-written sources PURE: 816.7 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;419.5&quot; cy=&quot;191.3&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#34 1eae38c6d chore: regenerate every SDK with the full codegen pipeline: 829.9 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;449.4&quot; cy=&quot;190.5&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#37 42e9e3a33 bench: measure import time and first call in a sequential cold-start pass: 840.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;459.4&quot; cy=&quot;192.5&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#38 03057c503 perf: patch effect so bundlers can drop HttpClientErrorSchema: 813.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;469.3&quot; cy=&quot;188.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#39 ffb890825 build: rolldown 1.2.8; drop the effect HttpClientErrorSchema patch: 862.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;479.3&quot; cy=&quot;199.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#40 f96685623 Merge branch &apos;exp/data-tables&apos; into perf/sdk-footprint: 727.9 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;489.2&quot; cy=&quot;206.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#41 565b4b0e2 chore: remove scratch bundle output committed by mistake: 631.9 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;539.0&quot; cy=&quot;211.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#46 f6019b376 perf(build): lazy stubs write each export name once and import one package helper: 567.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;text x=&quot;97.97826086956522&quot; y=&quot;40.83262399999998&quot;&gt;2.66 MB&lt;/text&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;201.751224&quot; text-anchor=&quot;end&quot;&gt;567.3 KB&lt;/text&gt;&lt;text transform=&quot;translate(103.93478260869566,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;5358d66&lt;/text&gt;&lt;text transform=&quot;translate(123.84782608695653,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;14d9302&lt;/text&gt;&lt;text transform=&quot;translate(143.7608695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;751b30b&lt;/text&gt;&lt;text transform=&quot;translate(163.67391304347825,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;e02e9d4&lt;/text&gt;&lt;text transform=&quot;translate(183.58695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d6ae0c8&lt;/text&gt;&lt;text transform=&quot;translate(203.5,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;cced62a&lt;/text&gt;&lt;text transform=&quot;translate(223.41304347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be83014&lt;/text&gt;&lt;text transform=&quot;translate(243.32608695652175,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;2298266&lt;/text&gt;&lt;text transform=&quot;translate(263.2391304347826,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be75448&lt;/text&gt;&lt;text transform=&quot;translate(283.1521739130435,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;b2297ea&lt;/text&gt;&lt;text transform=&quot;translate(303.0652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c5ca2e9&lt;/text&gt;&lt;text transform=&quot;translate(322.97826086956525,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;bf8b544&lt;/text&gt;&lt;text transform=&quot;translate(342.8913043478261,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;954ca6b&lt;/text&gt;&lt;text transform=&quot;translate(362.804347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1bc7899&lt;/text&gt;&lt;text transform=&quot;translate(382.71739130434787,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d2d5f33&lt;/text&gt;&lt;text transform=&quot;translate(402.63043478260875,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c0e8b9d&lt;/text&gt;&lt;text transform=&quot;translate(422.54347826086956,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1eae38c&lt;/text&gt;&lt;text transform=&quot;translate(442.45652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;3a43095&lt;/text&gt;&lt;text transform=&quot;translate(462.3695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;03057c5&lt;/text&gt;&lt;text transform=&quot;translate(482.2826086956522,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f966856&lt;/text&gt;&lt;text transform=&quot;translate(502.19565217391306,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1247e05&lt;/text&gt;&lt;text transform=&quot;translate(522.108695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;54eedde&lt;/text&gt;&lt;text transform=&quot;translate(542.0217391304348,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f6019b3&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h2 id=&quot;the-sane-fixes&quot;&gt;The sane fixes&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;hillclimb optimizing bundle size and memory footprint; be ambitious,
dont be afraid to boil the ocean&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This part you can get by just telling an agent to optimize. It follows
the worst number on the dashboard back to its cause, fixes it, runs the
benchmark again, and repeats. That loop never stopped. It kept running
in the main thread the whole time, even while other agents went off to
try much stranger ideas, which we’ll get to.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;small-imports-with-big-bills&quot;&gt;Small imports with big bills&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The single worst line was in a tiny file:&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;Effect&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Predicate&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&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;In a bundler that’s fine. In Node, importing from the &lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt; package
root loads every Effect module, and that line cost 3.3 MB and 36 ms on
every import of every SDK. Importing &lt;code dir=&quot;auto&quot;&gt;effect/Effect&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;effect/Predicate&lt;/code&gt; directly fixed it. That’s how the Effect team
recommends importing anyway, and the Effect language service has a
rule for it (&lt;code dir=&quot;auto&quot;&gt;importFromBarrel&lt;/code&gt;). We just don’t run it on generated
code. The same pattern hid in smaller
places: &lt;code dir=&quot;auto&quot;&gt;effect/Config&lt;/code&gt; for a few environment variables, &lt;code dir=&quot;auto&quot;&gt;Schedule&lt;/code&gt;
for retries, &lt;code dir=&quot;auto&quot;&gt;Stream.flatMap&lt;/code&gt; for pagination. Each now has a small
replacement in core, and your own &lt;code dir=&quot;auto&quot;&gt;ConfigProvider&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;Schedule&lt;/code&gt; still
works.&lt;/p&gt;
&lt;figure id=&quot;br&quot; aria-label=&quot;Modules loaded by a root import of effect, then by direct imports&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;pre id=&quot;br-code&quot;&gt;&lt;/pre&gt;&lt;div&gt;&lt;span&gt;Heap this line adds&lt;/span&gt;&lt;span id=&quot;br-heap&quot;&gt;0 KB&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div id=&quot;br-fill&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Modules loaded&lt;/span&gt;&lt;span id=&quot;br-n&quot;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Import time&lt;/span&gt;&lt;span id=&quot;br-ms&quot;&gt;0 ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;effect&lt;/b&gt; · 138 modules&lt;/div&gt;&lt;div id=&quot;br-grid&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;i&gt;&lt;/i&gt;needed &lt;i&gt;&lt;/i&gt;not needed&lt;/span&gt;&lt;button type=&quot;button&quot; id=&quot;br-replay&quot;&gt;↻ Replay&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h3 id=&quot;one-__pure__-does-not-cover-its-arguments&quot;&gt;One &lt;code dir=&quot;auto&quot;&gt;/*@__PURE__*/&lt;/code&gt; does not cover its arguments&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A bundle with only EC2’s &lt;code dir=&quot;auto&quot;&gt;describeRegions&lt;/code&gt; still kept 1,695 schemas.
The generator marked each top-level call &lt;code dir=&quot;auto&quot;&gt;/*@__PURE__*/&lt;/code&gt;, but that
marker only covers the outer call. The calls in its arguments still
count as side effects, so the bundler keeps everything they reference:&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;// Foo is never used, so the bundler tries to drop it.&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;Foo&lt;/span&gt;&lt;span&gt; &lt;/span&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;S&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Struct&lt;/span&gt;&lt;span&gt;({ &lt;/span&gt;&lt;span&gt;// dropped: marked pure&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;items&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;Array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Big&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;S&lt;/span&gt;&lt;span&gt;.optional))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// unused, but kept: not marked&lt;/span&gt;&lt;/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 generator now marks every nested call too, so the whole thing
goes:&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;Foo&lt;/span&gt;&lt;span&gt; &lt;/span&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;S&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Struct&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;items&lt;/span&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;S&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Array&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;Big&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;S&lt;/span&gt;&lt;span&gt;.optional))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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 EC2 bundle dropped from 137 KB to 75 KB.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;a-tree-shaking-bug-in-rolldown&quot;&gt;A tree-shaking bug in rolldown&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Every program that made an HTTP call kept about 15 KB gzip of Effect
Schema, even ones that never validated anything, because of one rarely used class in
Effect’s HTTP client. Rolldown 1.2.5 and 1.2.6 failed to tree-shake
it, and 1.2.7 fixed that. That one upgrade is the cliff in this chart:&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Bundle size&lt;/span&gt;&lt;span&gt; · median per program · lower is better&lt;/span&gt;&lt;span&gt;Minified rolldown bundle of a program that sets up auth and calls 1 operation, gzip -9.&lt;/span&gt;&lt;/figcaption&gt;&lt;div&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;normal&lt;/span&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;strict&lt;/span&gt;&lt;/div&gt;&lt;svg viewBox=&quot;0 0 560 320&quot; role=&quot;img&quot;&gt;&lt;defs&gt;&lt;clipPath id=&quot;bench-clip-12&quot;&gt;&lt;rect x=&quot;86&quot; y=&quot;16&quot; width=&quot;458&quot; height=&quot;246&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;rect x=&quot;215.43478260869566&quot; y=&quot;22&quot; width=&quot;328.5652173913044&quot; height=&quot;234&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;221.43478260869566&quot; y=&quot;15&quot;&gt;this work →&lt;/text&gt;&lt;text x=&quot;209.43478260869566&quot; y=&quot;15&quot; text-anchor=&quot;end&quot;&gt;← before&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;256&quot; y2=&quot;256&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;260&quot; text-anchor=&quot;end&quot;&gt;0 B&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;197.5&quot; y2=&quot;197.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;201.5&quot; text-anchor=&quot;end&quot;&gt;20.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;139&quot; y2=&quot;139&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;143&quot; text-anchor=&quot;end&quot;&gt;40.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;80.5&quot; y2=&quot;80.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;84.5&quot; text-anchor=&quot;end&quot;&gt;60.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;26&quot; text-anchor=&quot;end&quot;&gt;80.0 KB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-12)&quot; points=&quot;210.5,89.0 409.6,97.7 419.5,96.4 429.5,96.1 439.5,96.1 449.4,96.1 459.4,101.3 469.3,101.9 479.3,97.8 489.2,97.8 499.2,97.8 509.2,139.4 519.1,139.4 529.1,139.4 539.0,139.4&quot;&gt;&lt;/polyline&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;155.41535&quot; text-anchor=&quot;end&quot;&gt;strict 39.9 KB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-12)&quot; points=&quot;91.0,95.7 100.9,92.9 110.9,92.9 120.8,92.0 130.8,92.0 140.8,91.8 150.7,90.5 160.7,89.9 170.6,89.7 180.6,89.3 190.5,89.3 200.5,89.2 210.5,89.0 220.4,89.0 230.4,93.4 240.3,93.4 250.3,91.8 260.2,93.3 270.2,92.6 280.2,92.3 290.1,92.3 300.1,92.3 310.0,91.1 320.0,91.1 329.9,91.0 339.9,91.0 349.8,91.0 359.8,91.0 369.8,78.7 379.7,62.0 389.7,79.7 399.6,97.8 409.6,97.8 419.5,102.0 429.5,101.7 439.5,101.7 449.4,101.7 459.4,147.2 469.3,147.8 479.3,143.8 489.2,143.8 499.2,143.8 509.2,143.8 519.1,143.8 529.1,143.8 539.0,143.8&quot;&gt;&lt;/polyline&gt;&lt;circle cx=&quot;100.9&quot; cy=&quot;92.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#2 5358d6602 fix: upgrade Effect to 4.0.0-rc.117 (#637): 55.8 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;120.8&quot; cy=&quot;92.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#4 14d9302b7 fix(gcp): type HTTP 501 on Agent Engine sandboxes and workerPools.list (#656): 56.1 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;150.7&quot; cy=&quot;90.5&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#7 1f4a62973 fix(aws,cloudflare): type Workers preview conflict and Deadline UpdateQueue conflict (#683): 56.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;160.7&quot; cy=&quot;89.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#8 e02e9d405 chore(release): 1.0.0-rc.13: 56.8 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;230.4&quot; cy=&quot;93.4&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#15 f7bf885c1 perf(core): read the retry hint cap without effect/Config: 55.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;250.3&quot; cy=&quot;91.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#17 9e6000975 perf(core): share operation methods through one prototype: 56.1 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;260.2&quot; cy=&quot;93.3&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#18 be75448c1 chore: apply the nested PURE markers to every generated service: 55.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;270.2&quot; cy=&quot;92.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#19 0083c76af perf(core): build suspended schema ASTs on first use: 55.9 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;310.0&quot; cy=&quot;91.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#23 589790ecb perf(core): build generated error classes on first use: 56.4 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;369.8&quot; cy=&quot;78.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#29 d77bcaf0e chore: chunk schema builders in every generated service: 60.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;379.7&quot; cy=&quot;62.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#30 d2d5f33cd chore: table private schemas in every generated service: 66.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;389.7&quot; cy=&quot;79.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#31 cd90cb29e bench: add the Notion SDK target: 60.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;399.6&quot; cy=&quot;97.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#32 c0e8b9d81 perf: mark top-level calls in hand-written sources PURE: 54.1 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;419.5&quot; cy=&quot;102.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#34 1eae38c6d chore: regenerate every SDK with the full codegen pipeline: 52.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;459.4&quot; cy=&quot;147.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#38 03057c503 perf: patch effect so bundlers can drop HttpClientErrorSchema: 37.2 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;469.3&quot; cy=&quot;147.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#39 ffb890825 build: rolldown 1.2.8; drop the effect HttpClientErrorSchema patch: 37.0 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;479.3&quot; cy=&quot;143.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#40 f96685623 Merge branch &apos;exp/data-tables&apos; into perf/sdk-footprint: 38.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;text x=&quot;97.97826086956522&quot; y=&quot;87.65735000000001&quot;&gt;54.8 KB&lt;/text&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;133.846725&quot; text-anchor=&quot;end&quot;&gt;38.3 KB&lt;/text&gt;&lt;text transform=&quot;translate(103.93478260869566,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;5358d66&lt;/text&gt;&lt;text transform=&quot;translate(123.84782608695653,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;14d9302&lt;/text&gt;&lt;text transform=&quot;translate(143.7608695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;751b30b&lt;/text&gt;&lt;text transform=&quot;translate(163.67391304347825,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;e02e9d4&lt;/text&gt;&lt;text transform=&quot;translate(183.58695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d6ae0c8&lt;/text&gt;&lt;text transform=&quot;translate(203.5,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;cced62a&lt;/text&gt;&lt;text transform=&quot;translate(223.41304347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be83014&lt;/text&gt;&lt;text transform=&quot;translate(243.32608695652175,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;2298266&lt;/text&gt;&lt;text transform=&quot;translate(263.2391304347826,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be75448&lt;/text&gt;&lt;text transform=&quot;translate(283.1521739130435,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;b2297ea&lt;/text&gt;&lt;text transform=&quot;translate(303.0652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c5ca2e9&lt;/text&gt;&lt;text transform=&quot;translate(322.97826086956525,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;bf8b544&lt;/text&gt;&lt;text transform=&quot;translate(342.8913043478261,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;954ca6b&lt;/text&gt;&lt;text transform=&quot;translate(362.804347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1bc7899&lt;/text&gt;&lt;text transform=&quot;translate(382.71739130434787,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d2d5f33&lt;/text&gt;&lt;text transform=&quot;translate(402.63043478260875,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c0e8b9d&lt;/text&gt;&lt;text transform=&quot;translate(422.54347826086956,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1eae38c&lt;/text&gt;&lt;text transform=&quot;translate(442.45652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;3a43095&lt;/text&gt;&lt;text transform=&quot;translate(462.3695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;03057c5&lt;/text&gt;&lt;text transform=&quot;translate(482.2826086956522,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f966856&lt;/text&gt;&lt;text transform=&quot;translate(502.19565217391306,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1247e05&lt;/text&gt;&lt;text transform=&quot;translate(522.108695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;54eedde&lt;/text&gt;&lt;text transform=&quot;translate(542.0217391304348,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f6019b3&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;p&gt;At this point the agent said the numbers looked good and suggested
stopping. Every agent does this. It finds the safe wins, reports them,
and waits.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;stranger-but-defensible&quot;&gt;Stranger, but defensible&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Okay can you keep improving, we want all of these wayyyy wayyyy lower.
Do insane stuff, hillclimb the f*** out of this&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The sane fixes left the numbers better, but still far from where we
wanted them. So every time the agent reported progress, we asked for
something bigger and stranger, and fed it hunches we couldn’t prove
yet: that the specs were full of duplicate shapes, and that schemas
were most of the cost. The agent measured each hunch first, then
turned the ones that held up into code.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;one-em-dash-doubles-a-modules-memory&quot;&gt;One em dash doubles a module’s memory&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;V8 keeps every module’s source text in memory. If one character is
outside Latin-1, it stores the whole file at two bytes per character.
Escaping three characters in S3’s module cut its import memory from
2,240 KB to 1,570 KB. Shipped code is now Latin-1 only, and a test
enforces it.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;the-same-schema-thousands-of-times&quot;&gt;The same schema, thousands of times&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;API specs are repetitive. Stripe alone has 12,529 named shapes, and
most of them are copies: dozens of enums that are all just “a string”,
empty response objects, and the same struct redeclared on every
endpoint. Each copy became its own object at import.&lt;/p&gt;
&lt;p&gt;The generator now keeps one of each. Comparing shapes field by field
breaks down when shapes refer to themselves, so it uses the algorithm
compilers use to shrink state machines,
&lt;a href=&quot;https://en.wikipedia.org/wiki/DFA_minimization#Moore&amp;#x27;s_algorithm&quot;&gt;partition refinement&lt;/a&gt;:
assume everything of the same kind is the same, then keep splitting
groups until every member of a group points at the same groups. A
split can make the shapes that point at it split in the next round,
so changes ripple up one level at a time. Shapes that only point at
themselves never split, so recursion just works.
Stripe went from 12,529 shapes to 2,720, and its import memory from
9.9 MB to 0.86 MB.&lt;/p&gt;
&lt;figure id=&quot;dd&quot; aria-label=&quot;Partition refinement folding fifteen generated schemas into seven&quot;&gt;&lt;div&gt;&lt;span id=&quot;dd-step&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;b id=&quot;dd-n&quot;&gt;15&lt;/b&gt; schemas&lt;/span&gt;&lt;button type=&quot;button&quot; id=&quot;dd-pause&quot; aria-pressed=&quot;false&quot;&gt;❚❚ Pause&lt;/button&gt;&lt;/div&gt;&lt;div id=&quot;dd-stage&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;Stripe&lt;/b&gt; 12,529 → &lt;b&gt;2,720&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Cloudflare Workers&lt;/b&gt; 2,643 → &lt;b&gt;491&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;EC2&lt;/b&gt; 3,851 → &lt;b&gt;2,553&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;figcaption&gt;Made-up schemas above · real services below&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h3 id=&quot;faster-calls&quot;&gt;Faster calls&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Every call used to run as a generator, with one &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt; per 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;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;protocol&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;Protocol&lt;/span&gt;&lt;span&gt;;&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;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;protocol&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;({ input&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; inputAst&lt;/span&gt;&lt;span&gt;,&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;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;execute&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;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;protocol&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;({ response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; outputAst&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; errors&lt;/span&gt;&lt;span&gt;,&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Each &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt; is a trip through Effect’s runtime, and encode and decode
were generators too. Now, on the first call of an operation, the
protocol compiles a plan for its schemas: which fields go in the path,
the query and the body. Every later call builds the request from that
plan with plain JavaScript, sends it, and decodes the same way. The
only effect left in the middle is the HTTP request.&lt;/p&gt;
&lt;p&gt;This is added latency per call across the whole project. The strict
line took longer to come down, for reasons the next section explains.&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Runtime speed&lt;/span&gt;&lt;span&gt; · median per program · lower is better&lt;/span&gt;&lt;span&gt;Added latency: p50 of a call against a mocked HTTP response minus p50 of a bare mocked round trip.&lt;/span&gt;&lt;/figcaption&gt;&lt;div&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;normal&lt;/span&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;strict&lt;/span&gt;&lt;/div&gt;&lt;svg viewBox=&quot;0 0 560 320&quot; role=&quot;img&quot;&gt;&lt;defs&gt;&lt;clipPath id=&quot;bench-clip-13&quot;&gt;&lt;rect x=&quot;86&quot; y=&quot;16&quot; width=&quot;458&quot; height=&quot;246&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;rect x=&quot;215.43478260869566&quot; y=&quot;22&quot; width=&quot;328.5652173913044&quot; height=&quot;234&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;221.43478260869566&quot; y=&quot;15&quot;&gt;this work →&lt;/text&gt;&lt;text x=&quot;209.43478260869566&quot; y=&quot;15&quot; text-anchor=&quot;end&quot;&gt;← before&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;256&quot; y2=&quot;256&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;260&quot; text-anchor=&quot;end&quot;&gt;0.0 µs&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;178&quot; y2=&quot;178&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;182&quot; text-anchor=&quot;end&quot;&gt;10.0 µs&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;100&quot; y2=&quot;100&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;104&quot; text-anchor=&quot;end&quot;&gt;20.0 µs&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;26&quot; text-anchor=&quot;end&quot;&gt;30.0 µs&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-13)&quot; points=&quot;210.5,68.1 409.6,151.6 419.5,123.4 429.5,154.9 439.5,135.1 449.4,146.4 459.4,150.9 469.3,150.4 479.3,209.7 489.2,211.4 499.2,213.3 509.2,214.7 519.1,215.6 529.1,216.0 539.0,214.5&quot;&gt;&lt;/polyline&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;230.5001&quot; text-anchor=&quot;end&quot;&gt;strict 5.3 µs&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-13)&quot; points=&quot;91.0,52.7 100.9,50.0 110.9,48.6 120.8,28.1 130.8,117.8 140.8,120.0 150.7,107.2 160.7,113.4 170.6,113.8 180.6,120.4 190.5,121.1 200.5,111.8 210.5,104.1 220.4,119.0 230.4,119.4 240.3,117.1 250.3,117.7 260.2,118.7 270.2,119.6 280.2,123.5 290.1,123.8 300.1,60.2 310.0,58.0 320.0,53.7 329.9,121.7 339.9,115.6 349.8,174.0 359.8,173.6 369.8,176.4 379.7,176.7 389.7,176.6 399.6,172.6 409.6,182.0 419.5,176.6 429.5,202.1 439.5,187.9 449.4,196.7 459.4,199.2 469.3,196.7 479.3,223.2 489.2,224.3 499.2,224.5 509.2,224.5 519.1,226.8 529.1,225.1 539.0,224.7&quot;&gt;&lt;/polyline&gt;&lt;circle cx=&quot;120.8&quot; cy=&quot;28.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#4 14d9302b7 fix(gcp): type HTTP 501 on Agent Engine sandboxes and workerPools.list (#656): 29.2 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;130.8&quot; cy=&quot;117.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#5 6b83c9643 fix(gcp): no environment variables for the default region (#669): 17.7 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;150.7&quot; cy=&quot;107.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#7 1f4a62973 fix(aws,cloudflare): type Workers preview conflict and Deadline UpdateQueue conflict (#683): 19.1 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;160.7&quot; cy=&quot;113.4&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#8 e02e9d405 chore(release): 1.0.0-rc.13: 18.3 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;180.6&quot; cy=&quot;120.4&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#10 d6ae0c898 feat(aws/auto-scaling): type InvalidIamInstanceProfile on create/updateAutoScalingGroup (#764): 17.4 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;210.5&quot; cy=&quot;104.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#13 40a9500a7 feat(notion): add the Notion SDK (#855): 19.5 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;220.4&quot; cy=&quot;119.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#14 be83014bb perf(core): build pagination streams without Stream.flatMap: 17.6 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;300.1&quot; cy=&quot;60.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#22 c5ca2e97c perf: keep hand-written shipped sources Latin-1 only: 25.1 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;329.9&quot; cy=&quot;121.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#25 59c556594 chore: apply schema dedupe to every generated service: 17.2 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;339.9&quot; cy=&quot;115.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#26 954ca6b3f perf(aws): sign with synchronous node:crypto where available: 18.0 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;349.8&quot; cy=&quot;174.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#27 329034941 perf: strip JSDoc from compiled JavaScript: 10.5 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;399.6&quot; cy=&quot;172.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#32 c0e8b9d81 perf: mark top-level calls in hand-written sources PURE: 10.7 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;409.6&quot; cy=&quot;182.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#33 bf15d2f3a bench: imports suite and object counts; strict variant of every program: 9.5 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;419.5&quot; cy=&quot;176.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#34 1eae38c6d chore: regenerate every SDK with the full codegen pipeline: 10.2 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;429.5&quot; cy=&quot;202.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#35 d9d273817 perf: Stripe and Cloudflare encode/decode without generators: 6.9 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;439.5&quot; cy=&quot;187.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#36 3a430953b bench: pin AWS SDK internals past the minimum release age: 8.7 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;449.4&quot; cy=&quot;196.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#37 42e9e3a33 bench: measure import time and first call in a sequential cold-start pass: 7.6 µs&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;479.3&quot; cy=&quot;223.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#40 f96685623 Merge branch &apos;exp/data-tables&apos; into perf/sdk-footprint: 4.2 µs&lt;/title&gt;&lt;/circle&gt;&lt;text x=&quot;97.97826086956522&quot; y=&quot;44.70079999999999&quot;&gt;26.1 µs&lt;/text&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;214.6635&quot; text-anchor=&quot;end&quot;&gt;4.0 µs&lt;/text&gt;&lt;text transform=&quot;translate(103.93478260869566,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;5358d66&lt;/text&gt;&lt;text transform=&quot;translate(123.84782608695653,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;14d9302&lt;/text&gt;&lt;text transform=&quot;translate(143.7608695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;751b30b&lt;/text&gt;&lt;text transform=&quot;translate(163.67391304347825,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;e02e9d4&lt;/text&gt;&lt;text transform=&quot;translate(183.58695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d6ae0c8&lt;/text&gt;&lt;text transform=&quot;translate(203.5,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;cced62a&lt;/text&gt;&lt;text transform=&quot;translate(223.41304347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be83014&lt;/text&gt;&lt;text transform=&quot;translate(243.32608695652175,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;2298266&lt;/text&gt;&lt;text transform=&quot;translate(263.2391304347826,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be75448&lt;/text&gt;&lt;text transform=&quot;translate(283.1521739130435,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;b2297ea&lt;/text&gt;&lt;text transform=&quot;translate(303.0652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c5ca2e9&lt;/text&gt;&lt;text transform=&quot;translate(322.97826086956525,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;bf8b544&lt;/text&gt;&lt;text transform=&quot;translate(342.8913043478261,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;954ca6b&lt;/text&gt;&lt;text transform=&quot;translate(362.804347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1bc7899&lt;/text&gt;&lt;text transform=&quot;translate(382.71739130434787,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d2d5f33&lt;/text&gt;&lt;text transform=&quot;translate(402.63043478260875,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c0e8b9d&lt;/text&gt;&lt;text transform=&quot;translate(422.54347826086956,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1eae38c&lt;/text&gt;&lt;text transform=&quot;translate(442.45652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;3a43095&lt;/text&gt;&lt;text transform=&quot;translate(462.3695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;03057c5&lt;/text&gt;&lt;text transform=&quot;translate(482.2826086956522,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f966856&lt;/text&gt;&lt;text transform=&quot;translate(502.19565217391306,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1247e05&lt;/text&gt;&lt;text transform=&quot;translate(522.108695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;54eedde&lt;/text&gt;&lt;text transform=&quot;translate(542.0217391304348,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f6019b3&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;div&gt;&lt;h3 id=&quot;faster-smaller-aws-signing&quot;&gt;Faster, smaller AWS signing&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;AWS also signs every request, and signing was the single most
expensive part of an AWS call. SigV4 used to take six async WebCrypto
steps, each one a promise round trip. Switching to synchronous hashing
with &lt;code dir=&quot;auto&quot;&gt;node:crypto&lt;/code&gt; alone took S3 &lt;code dir=&quot;auto&quot;&gt;listBuckets&lt;/code&gt; from 352 µs to 149 µs
of added latency, DynamoDB &lt;code dir=&quot;auto&quot;&gt;listTables&lt;/code&gt; from 218 µs to 103 µs and STS
&lt;code dir=&quot;auto&quot;&gt;getCallerIdentity&lt;/code&gt; from 282 µs to 125 µs. Preparing keys once and
building the canonical request without parsing URLs took the rest.
S3 &lt;code dir=&quot;auto&quot;&gt;listBuckets&lt;/code&gt; now adds 19.4 µs. A side-by-side check of 33,798 cases
across 24 AWS services gave identical requests and results.&lt;/p&gt;
&lt;p&gt;Synchronous hashing has a trade-off: it blocks the event loop while it
runs. For a request, that’s a few microseconds of hashing, less than
one async round trip, which also costs a trip through the event loop
and evicts whatever was in the CPU cache. A huge request body is where
blocking would start to matter. The hashing goes through a swappable
&lt;code dir=&quot;auto&quot;&gt;Crypto&lt;/code&gt; service, so runtimes without Node use WebCrypto, and you can
plug in your own.&lt;/p&gt;
&lt;p&gt;We also pulled the signer out into its own small package,
&lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/aws4signer&lt;/code&gt;. Cloudflare R2 speaks the S3 API and
needs SigV4 signing too, so code that signs R2 requests no longer
pulls in the rest of the AWS SDK.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;where-that-left-us&quot;&gt;Where that left us&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Before the big rewrites started, the numbers already looked like a
finished project. Compared with where we began, added latency per
call was down from 17.3 µs to 10.7 µs, and import memory from 2.10 MB
to 0.84 MB. Most people would stop here.&lt;/p&gt;
&lt;p&gt;The bundle barely moved, though: 57.0 KB to 54.0 KB. Every program
still carried Effect Schema, whether it validated anything or not. To
fix that, we had to stop tuning distilled and start replacing parts of
it.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;experiments-and-our-own-schema-library&quot;&gt;Experiments, and our own schema library&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;experiments should be radical shifts boiling the ocean; ambitious
sh*t; agents are phenomenal and can do extreme things&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The biggest wins came from ideas that might not work, and trying one
can take a long time. If the one agent doing the work stops to try it,
everything else stops too. So we told it to keep the main thread on
the slowest number and hand radical ideas to new agents. That split
the work into three roles that run at the same time:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The main thread hillclimbs.&lt;/strong&gt; It runs the benchmark after every
change, picks the worst number, and fixes it with small, safe
commits. Along the way it writes down the wild ideas it doesn’t
have time for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subagents chase the wild ideas.&lt;/strong&gt; Each one gets its own worktree
and one idea: lazy error classes, bundling each SDK into a few
files, rewriting the AWS call path, Node-only service stubs. It
builds the idea for real and benchmarks it as an experiment
against the current head. The dashboard keeps experiments off the
timeline and shows each one next to its baseline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The main thread merges what worked.&lt;/strong&gt; An experiment that beats
its baseline without regressing anything else gets merged. One that
doesn’t stays behind as a data point, so nobody tries it again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An experiment is just a benchmark run with a name:&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;bench&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--experiment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;schema-free generated code&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;It stays off the commit timeline and shows up on every chart as a flat
dashed line, so we could see at a glance whether an idea beat the
branch:&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Bundle size&lt;/span&gt;&lt;span&gt; · median over the 96 programs every experiment ran · lower is better&lt;/span&gt;&lt;span&gt;Each experiment is a flat line across the commit timeline.&lt;/span&gt;&lt;/figcaption&gt;&lt;div&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;normal&lt;/span&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;strict&lt;/span&gt;&lt;span title=&quot;E2 PR #671 (schema-free descriptors)&quot;&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;E2&lt;/span&gt;&lt;span title=&quot;E3 schema-free generated code (lite)&quot;&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;E3&lt;/span&gt;&lt;span title=&quot;E4 schema-free generated code (lite) + Effect patch&quot;&gt;&lt;svg viewBox=&quot;0 0 26 8&quot; aria-hidden=&quot;true&quot;&gt;&lt;line x1=&quot;1&quot; x2=&quot;25&quot; y1=&quot;4&quot; y2=&quot;4&quot;&gt;&lt;/line&gt;&lt;/svg&gt;E4&lt;/span&gt;&lt;/div&gt;&lt;svg viewBox=&quot;0 0 560 320&quot; role=&quot;img&quot;&gt;&lt;defs&gt;&lt;clipPath id=&quot;bench-clip-14&quot;&gt;&lt;rect x=&quot;86&quot; y=&quot;16&quot; width=&quot;458&quot; height=&quot;246&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;rect x=&quot;215.43478260869566&quot; y=&quot;22&quot; width=&quot;328.5652173913044&quot; height=&quot;234&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;221.43478260869566&quot; y=&quot;15&quot;&gt;this work →&lt;/text&gt;&lt;text x=&quot;209.43478260869566&quot; y=&quot;15&quot; text-anchor=&quot;end&quot;&gt;← before&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;256&quot; y2=&quot;256&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;260&quot; text-anchor=&quot;end&quot;&gt;0 B&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;197.5&quot; y2=&quot;197.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;201.5&quot; text-anchor=&quot;end&quot;&gt;20.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;139&quot; y2=&quot;139&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;143&quot; text-anchor=&quot;end&quot;&gt;40.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;80.5&quot; y2=&quot;80.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;84.5&quot; text-anchor=&quot;end&quot;&gt;60.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;26&quot; text-anchor=&quot;end&quot;&gt;80.0 KB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;147.719425&quot; y2=&quot;147.719425&quot;&gt;&lt;/line&gt;&lt;text x=&quot;92&quot; y=&quot;142.719425&quot;&gt;E4 · 37.0 KB&lt;title&gt;E4 schema-free generated code (lite) + Effect patch&lt;/title&gt;&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;102.06163749999999&quot; y2=&quot;102.06163749999999&quot;&gt;&lt;/line&gt;&lt;text x=&quot;92&quot; y=&quot;97.06163749999999&quot;&gt;E3 · 52.6 KB&lt;title&gt;E3 schema-free generated code (lite)&lt;/title&gt;&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;91.43949999999998&quot; y2=&quot;91.43949999999998&quot;&gt;&lt;/line&gt;&lt;text x=&quot;92&quot; y=&quot;73.43949999999998&quot;&gt;E2 · 56.3 KB&lt;title&gt;E2 PR #671 (schema-free descriptors)&lt;/title&gt;&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-14)&quot; points=&quot;210.5,89.1 409.6,97.8 419.5,96.4 429.5,96.1 439.5,96.1 449.4,96.1 459.4,101.4 469.3,101.9 479.3,97.8 489.2,97.8 499.2,97.8 509.2,139.5 519.1,139.5 529.1,139.5 539.0,139.5&quot;&gt;&lt;/polyline&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;155.5133375&quot; text-anchor=&quot;end&quot;&gt;strict 39.8 KB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-14)&quot; points=&quot;91.0,95.7 100.9,92.9 110.9,92.9 120.8,92.0 130.8,92.0 140.8,91.8 150.7,90.5 160.7,89.9 170.6,89.7 180.6,89.3 200.5,89.2 210.5,89.2 220.4,89.2 230.4,93.9 240.3,93.9 250.3,92.1 260.2,93.4 270.2,92.7 280.2,92.4 290.1,92.4 300.1,92.4 310.0,91.2 320.0,91.1 329.9,91.1 339.9,91.1 349.8,91.0 359.8,91.0 369.8,78.7 379.7,60.2 389.7,79.7 399.6,97.8 409.6,97.8 419.5,102.1 429.5,101.7 439.5,101.7 449.4,101.7 459.4,147.3 469.3,147.9 479.3,143.9 489.2,143.9 499.2,143.9 509.2,143.9 519.1,143.9 529.1,143.9 539.0,143.9&quot;&gt;&lt;/polyline&gt;&lt;circle cx=&quot;100.9&quot; cy=&quot;92.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#2 5358d6602 fix: upgrade Effect to 4.0.0-rc.117 (#637): 55.8 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;120.8&quot; cy=&quot;92.0&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#4 14d9302b7 fix(gcp): type HTTP 501 on Agent Engine sandboxes and workerPools.list (#656): 56.1 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;150.7&quot; cy=&quot;90.5&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#7 1f4a62973 fix(aws,cloudflare): type Workers preview conflict and Deadline UpdateQueue conflict (#683): 56.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;160.7&quot; cy=&quot;89.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#8 e02e9d405 chore(release): 1.0.0-rc.13: 56.8 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;230.4&quot; cy=&quot;93.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#15 f7bf885c1 perf(core): read the retry hint cap without effect/Config: 55.4 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;250.3&quot; cy=&quot;92.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#17 9e6000975 perf(core): share operation methods through one prototype: 56.0 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;260.2&quot; cy=&quot;93.4&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#18 be75448c1 chore: apply the nested PURE markers to every generated service: 55.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;270.2&quot; cy=&quot;92.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#19 0083c76af perf(core): build suspended schema ASTs on first use: 55.8 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;310.0&quot; cy=&quot;91.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#23 589790ecb perf(core): build generated error classes on first use: 56.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;369.8&quot; cy=&quot;78.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#29 d77bcaf0e chore: chunk schema builders in every generated service: 60.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;379.7&quot; cy=&quot;60.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#30 d2d5f33cd chore: table private schemas in every generated service: 66.9 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;389.7&quot; cy=&quot;79.7&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#31 cd90cb29e bench: add the Notion SDK target: 60.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;399.6&quot; cy=&quot;97.8&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#32 c0e8b9d81 perf: mark top-level calls in hand-written sources PURE: 54.1 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;419.5&quot; cy=&quot;102.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#34 1eae38c6d chore: regenerate every SDK with the full codegen pipeline: 52.6 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;459.4&quot; cy=&quot;147.3&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#38 03057c503 perf: patch effect so bundlers can drop HttpClientErrorSchema: 37.2 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;469.3&quot; cy=&quot;147.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#39 ffb890825 build: rolldown 1.2.8; drop the effect HttpClientErrorSchema patch: 37.0 KB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;479.3&quot; cy=&quot;143.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#40 f96685623 Merge branch &apos;exp/data-tables&apos; into perf/sdk-footprint: 38.3 KB&lt;/title&gt;&lt;/circle&gt;&lt;text x=&quot;97.97826086956522&quot; y=&quot;87.65735000000001&quot;&gt;54.8 KB&lt;/text&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;133.9096125&quot; text-anchor=&quot;end&quot;&gt;38.3 KB&lt;/text&gt;&lt;text transform=&quot;translate(103.93478260869566,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;5358d66&lt;/text&gt;&lt;text transform=&quot;translate(123.84782608695653,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;14d9302&lt;/text&gt;&lt;text transform=&quot;translate(143.7608695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;751b30b&lt;/text&gt;&lt;text transform=&quot;translate(163.67391304347825,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;e02e9d4&lt;/text&gt;&lt;text transform=&quot;translate(183.58695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d6ae0c8&lt;/text&gt;&lt;text transform=&quot;translate(203.5,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;cced62a&lt;/text&gt;&lt;text transform=&quot;translate(223.41304347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be83014&lt;/text&gt;&lt;text transform=&quot;translate(243.32608695652175,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;2298266&lt;/text&gt;&lt;text transform=&quot;translate(263.2391304347826,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be75448&lt;/text&gt;&lt;text transform=&quot;translate(283.1521739130435,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;b2297ea&lt;/text&gt;&lt;text transform=&quot;translate(303.0652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c5ca2e9&lt;/text&gt;&lt;text transform=&quot;translate(322.97826086956525,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;bf8b544&lt;/text&gt;&lt;text transform=&quot;translate(342.8913043478261,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;954ca6b&lt;/text&gt;&lt;text transform=&quot;translate(362.804347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1bc7899&lt;/text&gt;&lt;text transform=&quot;translate(382.71739130434787,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d2d5f33&lt;/text&gt;&lt;text transform=&quot;translate(402.63043478260875,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c0e8b9d&lt;/text&gt;&lt;text transform=&quot;translate(422.54347826086956,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1eae38c&lt;/text&gt;&lt;text transform=&quot;translate(442.45652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;3a43095&lt;/text&gt;&lt;text transform=&quot;translate(462.3695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;03057c5&lt;/text&gt;&lt;text transform=&quot;translate(482.2826086956522,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f966856&lt;/text&gt;&lt;text transform=&quot;translate(502.19565217391306,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1247e05&lt;/text&gt;&lt;text transform=&quot;translate(522.108695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;54eedde&lt;/text&gt;&lt;text transform=&quot;translate(542.0217391304348,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f6019b3&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;p&gt;While a subagent worked on a big bet, the main thread kept landing
small wins. 38 of our 84 benchmark runs were experiments. Some ideas
took three or four experiments to try different implementations, and
we kept the best one. The biggest experiment was replacing Effect Schema, and the dashed line
at the bottom of the chart above is the version that won.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;why-effect-schema-had-to-go&quot;&gt;Why Effect Schema had to go&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Every generated schema was a real Effect Schema object. That put about
37 KB gzip of Schema code into every bundle, and built thousands of
schema objects at import. Most of that was never used. Encoding a
request and reading a response only need the schema’s &lt;em&gt;structure&lt;/em&gt;:
field names, which field goes in the path or a header, how a timestamp
is formatted, and so on. Effect Schema’s parser only matters when you turn on
strict validation.&lt;/p&gt;
&lt;p&gt;We didn’t set out to write a schema library. The agent tried
everything else first, on real shapes from EC2, S3, DynamoDB, Stripe
and Cloudflare Workers. Stripe, after dedupe:&lt;/p&gt;
&lt;div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Import memory&lt;/th&gt;
&lt;th&gt;First-use memory&lt;/th&gt;
&lt;th&gt;µs per validation&lt;/th&gt;
&lt;th&gt;1-op bundle gz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Effect Schema (lazy)&lt;/td&gt;
&lt;td&gt;0.86 MB&lt;/td&gt;
&lt;td&gt;11.3 MB&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;27.5 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;valibot&lt;/td&gt;
&lt;td&gt;20 MB&lt;/td&gt;
&lt;td&gt;0.2 MB&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;6.0 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zod/mini (before dedupe)&lt;/td&gt;
&lt;td&gt;114 MB&lt;/td&gt;
&lt;td&gt;0.7 MB&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;9.3 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeBox (before dedupe)&lt;/td&gt;
&lt;td&gt;14 MB&lt;/td&gt;
&lt;td&gt;1.9 MB&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;27.9 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;schema-lite (ours)&lt;/td&gt;
&lt;td&gt;2.3 MB&lt;/td&gt;
&lt;td&gt;0.17 MB&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;4.6 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Every library lost on at least one axis we cared about. Effect’s own
compilers didn’t help either: the ahead-of-time compiler can’t compile
through recursive shapes, so it generated 4.6 MB of code for EC2, and
the JIT mode doubled first-use memory. An earlier attempt,
&lt;a href=&quot;https://github.com/alchemy-run/distilled/pull/671&quot;&gt;PR #671&lt;/a&gt;, replaced
schemas with descriptors that only carry wire metadata. It was small,
but it couldn’t validate, so strict mode broke.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;our-problem-is-smaller&quot;&gt;Our problem is smaller&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A general schema library has to handle any schema a user can write:
transformations, refinements, defaults, branded types, async checks,
self-referencing structures in full generality, and detailed error
reports for all of it. That machinery costs bytes and memory.&lt;/p&gt;
&lt;p&gt;Distilled needs almost none of it. Every schema is generated from an
API spec and fixed at build time. They use about a dozen node kinds:
strings, numbers, booleans, literals, structs, arrays, records, unions
and optional fields. A recursive shape is just a named reference to
another generated shape. And there is only one question to answer:
does this decoded JSON match the shape the spec promised? So we wrote
&lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/core/schema-lite&lt;/code&gt;: plain data, plus one small
validator.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;same-api-plain-objects&quot;&gt;Same API, plain objects&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;schema-lite is a small subset of Effect Schema. It exports the
functions generated code already calls (&lt;code dir=&quot;auto&quot;&gt;Struct&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Array&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;optional&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;Union&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;suspend&lt;/code&gt; and so on) with the same names and types, so the
switch was one import line in every generated file:&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;S&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;@distilled.cloud/core/schema&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;S&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;@distilled.cloud/core/schema-lite&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;If you know Effect Schema, you can read distilled’s generated code.
What changed is what each call returns: a plain object with the same
fields as an Effect Schema AST node, and nothing else.&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;S&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Struct&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;S&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; tags&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;optional&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;Array&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;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// builds this, and only this:&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;&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;Objects&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;propertySignatures&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&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;id&quot;&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; { _tag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;String&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;&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;tags&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;/div&gt;&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;Union&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;context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { isOptional&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;types&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&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;Arrays&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; elements&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; rest&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;String&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;{ _tag&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Undefined&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;span&gt;]&lt;/span&gt;&lt;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;protocols-run-unchanged&quot;&gt;Protocols run unchanged&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Distilled’s protocol code (REST and AWS’s six wire protocols) already
worked by walking the AST: &lt;code dir=&quot;auto&quot;&gt;_tag&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;propertySignatures&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;annotations&lt;/code&gt;. A lite node has exactly those fields, so the protocols
didn’t need to know anything changed. AWS also needs to turn
timestamps and base64 blobs into wire values, and lite nodes carry
that in an &lt;code dir=&quot;auto&quot;&gt;encoding&lt;/code&gt; field with the same shape Effect uses. We
checked the switch by encoding 1,516 requests and decoding 426
responses through both implementations. The bytes were identical.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;strict-mode-and-still-faster-than-the-official-sdks&quot;&gt;Strict mode, and still faster than the official SDKs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Official SDKs trust the API. Providers change their APIs without
warning, smaller ones especially (&lt;em&gt;cough&lt;/em&gt; Cloudflare &lt;em&gt;cough&lt;/em&gt;). The
request still succeeds, so bad data flows into your app until
something breaks far from the cause. Strict mode turns that into a
controlled failure: a typed &lt;code dir=&quot;auto&quot;&gt;ParseError&lt;/code&gt; with the path to the bad
field, right at the call. It’s one line:&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;program&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;ResponseValidation&lt;/span&gt;&lt;span&gt;.strict))&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;Under schema-lite, each node compiles once into a small checker, and
the compiler itself only loads if you turn strict mode on. A test
checks that it accepts and rejects exactly what Effect Schema does.&lt;/p&gt;
&lt;p&gt;Distilled also types &lt;strong&gt;every error&lt;/strong&gt;, so each operation ships the full
union of errors it can fail with. We kept both, and compared them with
the official AWS SDK v3, &lt;code dir=&quot;auto&quot;&gt;cloudflare&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;@google-cloud/storage&lt;/code&gt;
packages, each imported the way its users would:&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;Bundle size of one call (gzip)&lt;/figcaption&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;official SDK&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;distilled&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;distilled, strict&lt;/li&gt;&lt;/ul&gt;&lt;svg viewBox=&quot;0 0 600 572&quot; role=&quot;img&quot; aria-label=&quot;Bundle size of one call (gzip). S3 ListBuckets: official SDK 157.0 KB, distilled 61.0 KB, distilled, strict 62.3 KB; DynamoDB: official SDK 144.8 KB, distilled 53.8 KB, distilled, strict 55.2 KB; KMS: official SDK 134.1 KB, distilled 53.2 KB, distilled, strict 54.5 KB; STS: official SDK 130.1 KB, distilled 55.2 KB, distilled, strict 56.6 KB; EC2: official SDK 265.2 KB, distilled 55.1 KB, distilled, strict 56.5 KB; Lambda: official SDK 141.3 KB, distilled 55.0 KB, distilled, strict 56.4 KB; Cloudflare Workers: official SDK 124.5 KB, distilled 55.8 KB, distilled, strict 57.4 KB; GCP Storage: official SDK 239.1 KB, distilled 39.7 KB, distilled, strict 41.3 KB&quot;&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;37&quot; text-anchor=&quot;end&quot;&gt;S3 ListBuckets&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;52&quot; text-anchor=&quot;end&quot;&gt;2.5× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;12&quot; width=&quot;210.75414781297135&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;386.7541478129714&quot; y=&quot;24.5&quot;&gt;157.0 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;31&quot; width=&quot;81.88536953242836&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;257.88536953242834&quot; y=&quot;43.5&quot;&gt;61.0 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;50&quot; width=&quot;83.63046757164405&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;259.63046757164403&quot; y=&quot;62.5&quot;&gt;62.3 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;107&quot; text-anchor=&quot;end&quot;&gt;DynamoDB&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;122&quot; text-anchor=&quot;end&quot;&gt;2.6× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;82&quot; width=&quot;194.3770739064857&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;370.3770739064857&quot; y=&quot;94.5&quot;&gt;144.8 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;101&quot; width=&quot;72.22021116138764&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;248.22021116138762&quot; y=&quot;113.5&quot;&gt;53.8 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;120&quot; width=&quot;74.09954751131222&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;250.0995475113122&quot; y=&quot;132.5&quot;&gt;55.2 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;177&quot; text-anchor=&quot;end&quot;&gt;KMS&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;192&quot; text-anchor=&quot;end&quot;&gt;2.5× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;152&quot; width=&quot;180.01357466063348&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;356.0135746606335&quot; y=&quot;164.5&quot;&gt;134.1 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;171&quot; width=&quot;71.41478129713424&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;247.41478129713425&quot; y=&quot;183.5&quot;&gt;53.2 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;190&quot; width=&quot;73.15987933634993&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;249.15987933634995&quot; y=&quot;202.5&quot;&gt;54.5 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;247&quot; text-anchor=&quot;end&quot;&gt;STS&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;262&quot; text-anchor=&quot;end&quot;&gt;2.3× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;222&quot; width=&quot;174.6440422322775&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;350.6440422322775&quot; y=&quot;234.5&quot;&gt;130.1 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;241&quot; width=&quot;74.09954751131222&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;250.0995475113122&quot; y=&quot;253.5&quot;&gt;55.2 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;260&quot; width=&quot;75.97888386123681&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;251.9788838612368&quot; y=&quot;272.5&quot;&gt;56.6 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;317&quot; text-anchor=&quot;end&quot;&gt;EC2&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;332&quot; text-anchor=&quot;end&quot;&gt;4.7× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;292&quot; width=&quot;356&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;532&quot; y=&quot;304.5&quot;&gt;265.2 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;311&quot; width=&quot;73.96530920060333&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;249.96530920060331&quot; y=&quot;323.5&quot;&gt;55.1 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;330&quot; width=&quot;75.84464555052791&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;251.8446455505279&quot; y=&quot;342.5&quot;&gt;56.5 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;387&quot; text-anchor=&quot;end&quot;&gt;Lambda&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;402&quot; text-anchor=&quot;end&quot;&gt;2.5× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;362&quot; width=&quot;189.67873303167426&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;365.67873303167426&quot; y=&quot;374.5&quot;&gt;141.3 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;381&quot; width=&quot;73.83107088989442&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;249.83107088989442&quot; y=&quot;393.5&quot;&gt;55.0 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;400&quot; width=&quot;75.710407239819&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;251.710407239819&quot; y=&quot;412.5&quot;&gt;56.4 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;457&quot; text-anchor=&quot;end&quot;&gt;Cloudflare Workers&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;472&quot; text-anchor=&quot;end&quot;&gt;2.2× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;432&quot; width=&quot;167.12669683257917&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;343.12669683257917&quot; y=&quot;444.5&quot;&gt;124.5 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;451&quot; width=&quot;74.90497737556561&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;250.9049773755656&quot; y=&quot;463.5&quot;&gt;55.8 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;470&quot; width=&quot;77.052790346908&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;253.052790346908&quot; y=&quot;482.5&quot;&gt;57.4 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;527&quot; text-anchor=&quot;end&quot;&gt;GCP Storage&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;542&quot; text-anchor=&quot;end&quot;&gt;5.8× smaller&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;502&quot; width=&quot;320.9638009049774&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;496.9638009049774&quot; y=&quot;514.5&quot;&gt;239.1 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;521&quot; width=&quot;53.29260935143289&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;229.29260935143287&quot; y=&quot;533.5&quot;&gt;39.7 KB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;540&quot; width=&quot;55.44042232277526&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;231.44042232277525&quot; y=&quot;552.5&quot;&gt;41.3 KB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;line x1=&quot;170&quot; x2=&quot;170&quot; y1=&quot;6&quot; y2=&quot;562&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;p&gt;The ratio compares the official SDK with distilled in strict mode.&lt;/p&gt;&lt;/figure&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;Latency each SDK adds to one call (p50)&lt;/figcaption&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;official SDK&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;distilled&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;distilled, strict&lt;/li&gt;&lt;/ul&gt;&lt;svg viewBox=&quot;0 0 600 572&quot; role=&quot;img&quot; aria-label=&quot;Latency each SDK adds to one call (p50). S3 ListBuckets: official SDK 140.2 µs, distilled 19.4 µs, distilled, strict 22.0 µs; DynamoDB: official SDK 87.3 µs, distilled 14.3 µs, distilled, strict 15.5 µs; KMS: official SDK 83.0 µs, distilled 14.4 µs, distilled, strict 16.4 µs; STS: official SDK 93.2 µs, distilled 16.1 µs, distilled, strict 16.6 µs; EC2: official SDK 97.3 µs, distilled 16.1 µs, distilled, strict 18.4 µs; Lambda: official SDK 79.3 µs, distilled 15.3 µs, distilled, strict 16.1 µs; Cloudflare Workers: official SDK 15.5 µs, distilled 3.0 µs, distilled, strict 1.0 µs; GCP Storage: official SDK 673.9 µs, distilled 6.2 µs, distilled, strict 7.0 µs&quot;&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;37&quot; text-anchor=&quot;end&quot;&gt;S3 ListBuckets&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;52&quot; text-anchor=&quot;end&quot;&gt;6.4× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;12&quot; width=&quot;311.945&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;487.945&quot; y=&quot;24.5&quot;&gt;140.2 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;31&quot; width=&quot;43.165&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;219.165&quot; y=&quot;43.5&quot;&gt;19.4 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;50&quot; width=&quot;48.95&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;224.95&quot; y=&quot;62.5&quot;&gt;22.0 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;107&quot; text-anchor=&quot;end&quot;&gt;DynamoDB&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;122&quot; text-anchor=&quot;end&quot;&gt;5.6× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;82&quot; width=&quot;194.2425&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;370.2425&quot; y=&quot;94.5&quot;&gt;87.3 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;101&quot; width=&quot;31.817500000000003&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;207.8175&quot; y=&quot;113.5&quot;&gt;14.3 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;120&quot; width=&quot;34.487500000000004&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;210.4875&quot; y=&quot;132.5&quot;&gt;15.5 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;177&quot; text-anchor=&quot;end&quot;&gt;KMS&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;192&quot; text-anchor=&quot;end&quot;&gt;5.1× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;152&quot; width=&quot;184.675&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;360.675&quot; y=&quot;164.5&quot;&gt;83.0 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;171&quot; width=&quot;32.04&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;208.04&quot; y=&quot;183.5&quot;&gt;14.4 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;190&quot; width=&quot;36.489999999999995&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;212.49&quot; y=&quot;202.5&quot;&gt;16.4 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;247&quot; text-anchor=&quot;end&quot;&gt;STS&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;262&quot; text-anchor=&quot;end&quot;&gt;5.6× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;222&quot; width=&quot;207.37&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;383.37&quot; y=&quot;234.5&quot;&gt;93.2 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;241&quot; width=&quot;35.822500000000005&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;211.8225&quot; y=&quot;253.5&quot;&gt;16.1 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;260&quot; width=&quot;36.935&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;212.935&quot; y=&quot;272.5&quot;&gt;16.6 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;317&quot; text-anchor=&quot;end&quot;&gt;EC2&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;332&quot; text-anchor=&quot;end&quot;&gt;5.3× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;292&quot; width=&quot;216.4925&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;392.4925&quot; y=&quot;304.5&quot;&gt;97.3 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;311&quot; width=&quot;35.822500000000005&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;211.8225&quot; y=&quot;323.5&quot;&gt;16.1 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;330&quot; width=&quot;40.94&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;216.94&quot; y=&quot;342.5&quot;&gt;18.4 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;387&quot; text-anchor=&quot;end&quot;&gt;Lambda&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;402&quot; text-anchor=&quot;end&quot;&gt;4.9× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;362&quot; width=&quot;176.4425&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;352.4425&quot; y=&quot;374.5&quot;&gt;79.3 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;381&quot; width=&quot;34.042500000000004&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;210.04250000000002&quot; y=&quot;393.5&quot;&gt;15.3 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;400&quot; width=&quot;35.822500000000005&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;211.8225&quot; y=&quot;412.5&quot;&gt;16.1 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;457&quot; text-anchor=&quot;end&quot;&gt;Cloudflare Workers&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;472&quot; text-anchor=&quot;end&quot;&gt;5.1× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;432&quot; width=&quot;34.487500000000004&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;210.4875&quot; y=&quot;444.5&quot;&gt;15.5 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;451&quot; width=&quot;6.675&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;182.675&quot; y=&quot;463.5&quot;&gt;3.0 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;470&quot; width=&quot;2.225&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;178.225&quot; y=&quot;482.5&quot;&gt;1.0 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;527&quot; text-anchor=&quot;end&quot;&gt;GCP Storage&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;542&quot; text-anchor=&quot;end&quot;&gt;96× faster&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;502&quot; width=&quot;356&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M500,500 l6,20 M508,500 l6,20&quot;&gt;&lt;/path&gt;&lt;text x=&quot;532&quot; y=&quot;514.5&quot;&gt;673.9 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;521&quot; width=&quot;13.795&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;189.795&quot; y=&quot;533.5&quot;&gt;6.2 µs&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;540&quot; width=&quot;15.575&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;191.575&quot; y=&quot;552.5&quot;&gt;7.0 µs&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;line x1=&quot;170&quot; x2=&quot;170&quot; y1=&quot;6&quot; y2=&quot;562&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;p&gt;GCP&apos;s official bar is cut to fit. The ratio compares the official SDK with the slower of distilled&apos;s two modes. Differences of a microsecond or two, like Cloudflare&apos;s strict bar, are within run-to-run noise.&lt;/p&gt;&lt;/figure&gt;
&lt;p&gt;Distilled with strict mode on is still 5 to 96 times faster per call
than official SDKs that check nothing.&lt;/p&gt;
&lt;p&gt;Per call isn’t the whole story for a CLI or a Lambda function. What
they wait for is the cold start: import the SDK, set up a client and
make the first call, in a fresh process. Bundled the way Alchemy
deploys to Lambda and Workers, distilled starts 2.0× faster than the
official SDK on AWS, 3.0× on Cloudflare and 1.2× on GCP. We measured
this with a separate local harness that isn’t part of the benchmark
suite yet.&lt;/p&gt;
&lt;p&gt;Unbundled, in plain &lt;code dir=&quot;auto&quot;&gt;node_modules&lt;/code&gt; like a CLI, distilled is slower on
AWS (107.5 ms against 42.8 ms) and GCP (96.0 ms against 67.2 ms), and
still faster on Cloudflare (94.3 ms against 156.2 ms), because Node
spends about 77 ms loading Effect’s ~150 separate modules, which a
bundle turns into one file.&lt;/p&gt;
&lt;p&gt;The first call on its own is about 1.5 ms slower in distilled on
Cloudflare. The official SDK is a thin wrapper around &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;, and
about 0.9 ms of the gap is the tracing span Effect opens for every
request.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;meta-tree-shaking&quot;&gt;Meta tree shaking&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;SURELY we can’t be at the limit yet! KEEP GOING, like ride this crazy
wave all the way into the volcano mannnnnnnn! kawabunga!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is the most unhinged message we sent the whole time, and it
produced the most unhinged idea. Importing all of AWS still took
35 MB, and the agent had told us that was close to the floor. After
the volcano message, it came back with this: do a bundler’s tree
shaking at run time, inside Node, on code that was never bundled.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;operations-as-data&quot;&gt;Operations as data&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Importing a service used to build every operation in it. EC2 has
hundreds of operations and AWS about 19,500. Now each operation waits
until someone calls it. We call this meta tree shaking. In spirit, the
published JavaScript looks like 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;let&lt;/span&gt;&lt;span&gt; built&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;getDomain&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;=&gt;&lt;/span&gt;&lt;span&gt; {&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 call: build the real operation, then remember it.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;built &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;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(() &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;input&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GetDomainRequest&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;span&gt;Domain&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;UnknownResendError&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;ResendProtocol&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;built&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;;&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 real output stores the description as a short string instead of
code, because a string takes less memory than the code that builds
the same object. Error classes work the same way, so a call that
succeeds never builds one.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;tree-shaking-at-run-time&quot;&gt;Tree shaking at run time&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A bundler drops unused code before you deploy. The Alchemy CLI doesn’t
bundle, so we do the same cut at run time instead. Every service ships
as two files: a tiny &lt;strong&gt;stub&lt;/strong&gt; that Node loads, and the &lt;strong&gt;full module&lt;/strong&gt;,
which stays on disk with an index at the end saying where each
operation’s bytes are and what it needs. This is the real start of the
stub for Fly.io’s &lt;code dir=&quot;auto&quot;&gt;machines&lt;/code&gt; service, exactly as it ships:&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;L&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;&quot;../_bundle/lazy.js&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;{o:&lt;/span&gt;&lt;span&gt;$o&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;e:&lt;/span&gt;&lt;span&gt;$e&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;E&lt;/span&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;L&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;../services.full/machines.js&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;55605&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;7533&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;Yes, that’s 99 &lt;code dir=&quot;auto&quot;&gt;o&lt;/code&gt;s, one empty placeholder per operation. No human
would write this, and no human has to read it. The two numbers say
where the index is. The index looks like 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;#    name           bytes          needs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;44   getMachine     19123..19407   13 sdk.js helpers, __d6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;60   listMachines   25842..26325   16 sdk.js helpers, __d6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;110  __d6           48375..48982   8 sdk.js helpers, __d3, __d5, __d4, __d22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;That’s the dependency graph a bundler builds, written down for Node.
The first call to a placeholder reads just that operation’s bytes, then
follows &lt;code dir=&quot;auto&quot;&gt;needs&lt;/code&gt; the same way. Helpers in &lt;code dir=&quot;auto&quot;&gt;sdk.js&lt;/code&gt; are already loaded
with the stub, so they cost nothing.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;no-eval-ever&quot;&gt;No &lt;code dir=&quot;auto&quot;&gt;eval&lt;/code&gt;, ever&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Reading part of a JavaScript file and running it sounds like it needs
&lt;code dir=&quot;auto&quot;&gt;eval&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;new Function&lt;/code&gt;. That would ruin the whole idea. Every &lt;code dir=&quot;auto&quot;&gt;eval&lt;/code&gt;
makes V8 parse and compile new code, which costs the time and memory
we were trying to save. It also means running bytes read from disk as
code, which security tools flag and many runtimes block outright.&lt;/p&gt;
&lt;p&gt;So the full module never stores operations as code. It stores them as
data. This is the real entry for &lt;code dir=&quot;auto&quot;&gt;getMachine&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;{input:#1,output:#9:4,errors:[$10,$11],protocol:$12,retry:$13}&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;#1&lt;/code&gt; is another entry in the same operation, and &lt;code dir=&quot;auto&quot;&gt;#9:4&lt;/code&gt; is an entry in
the shared holder for &lt;code dir=&quot;auto&quot;&gt;Machine&lt;/code&gt;. &lt;code dir=&quot;auto&quot;&gt;$10&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;$13&lt;/code&gt; are values already in
memory: the two error classes, the protocol and the retry policy. The
loader is a small interpreter for this format. It reads the bytes,
follows the references and calls the same schema-lite functions the
code would have called, so the result is identical. Nothing it reads
from disk is ever run as code, and V8 never compiles a single extra
line.&lt;/p&gt;
&lt;p&gt;Step through a real traced run that calls &lt;code dir=&quot;auto&quot;&gt;getMachine&lt;/code&gt;, then
&lt;code dir=&quot;auto&quot;&gt;listMachines&lt;/code&gt;, then &lt;code dir=&quot;auto&quot;&gt;getMachine&lt;/code&gt; again. If you want to see how
unhinged it really is, tick the box under the figure for the shipped
code:&lt;/p&gt;
&lt;figure id=&quot;lz&quot; tabindex=&quot;0&quot; aria-label=&quot;Step-through of a lazy service stub loading fly-io&amp;#x27;s machines service&quot;&gt;&lt;div id=&quot;lz-grid&quot;&gt;&lt;section&gt;&lt;div&gt;&lt;b&gt;Your program&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div id=&quot;lz-prog&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;lz-status&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;In memory&lt;/b&gt; · what it has loaded&lt;/div&gt;&lt;div&gt;&lt;div id=&quot;lz-left&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;div aria-hidden=&quot;true&quot;&gt;&lt;div&gt;&lt;div id=&quot;lz-memtrack&quot;&gt;&lt;div id=&quot;lz-memfill&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;in memory&lt;/span&gt;&lt;span id=&quot;lz-memval&quot;&gt;0 B&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div id=&quot;lz-disktrack&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;on disk&lt;/span&gt;&lt;span&gt;63.2&lt;br&gt;KB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;div&gt;&lt;b&gt;On disk&lt;/b&gt; · the full module, by byte offset&lt;/div&gt;&lt;div id=&quot;lz-fileview&quot;&gt;&lt;div id=&quot;lz-right&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/div&gt;&lt;div&gt;&lt;button type=&quot;button&quot; id=&quot;lz-prev&quot;&gt;◀ Back&lt;/button&gt;&lt;div id=&quot;lz-dots&quot;&gt;&lt;/div&gt;&lt;label title=&quot;Show the stub, the slices and the index exactly as they ship, minified&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;lz-real&quot;&gt;&lt;span&gt;&lt;b&gt;I can handle the truth&lt;/b&gt;&lt;/span&gt;&lt;/label&gt;&lt;button type=&quot;button&quot; id=&quot;lz-next&quot;&gt;Next ▶&lt;/button&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Three calls read 13,629 of the file’s 63,178 bytes, and 7,533 of those
are the index.&lt;/p&gt;
&lt;p&gt;Don’t worry: none of this touches your code unless you ask for it.
Stubs load only when Node resolves with the &lt;code dir=&quot;auto&quot;&gt;distilled-lazy&lt;/code&gt; export
condition (&lt;code dir=&quot;auto&quot;&gt;node --conditions=distilled-lazy&lt;/code&gt;). Plain Node and every
bundler get the normal full module.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;importing-a-whole-provider&quot;&gt;Importing a whole provider&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Programs that import a whole provider are where meta tree shaking pays
off most. AWS went from 227 MB to 13.9 MB.&lt;/p&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;Memory to import every service of a provider&lt;/figcaption&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;before&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;after&lt;/li&gt;&lt;/ul&gt;&lt;svg viewBox=&quot;0 0 600 216&quot; role=&quot;img&quot; aria-label=&quot;Memory to import every service of a provider. AWS (438): before 227.0 MB, after 13.9 MB; GCP (318): before 111.0 MB, after 9.4 MB; Azure (224): before 112.0 MB, after 8.0 MB; Cloudflare (129): before 76.0 MB, after 3.2 MB&quot;&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;27.5&quot; text-anchor=&quot;end&quot;&gt;AWS (438)&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;42.5&quot; text-anchor=&quot;end&quot;&gt;16× less&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;12&quot; width=&quot;356&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;532&quot; y=&quot;24.5&quot;&gt;227.0 MB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;31&quot; width=&quot;21.79911894273128&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;197.79911894273127&quot; y=&quot;43.5&quot;&gt;13.9 MB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;78.5&quot; text-anchor=&quot;end&quot;&gt;GCP (318)&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;93.5&quot; text-anchor=&quot;end&quot;&gt;12× less&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;63&quot; width=&quot;174.07929515418502&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;350.07929515418505&quot; y=&quot;75.5&quot;&gt;111.0 MB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;82&quot; width=&quot;14.741850220264316&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;190.74185022026433&quot; y=&quot;94.5&quot;&gt;9.4 MB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;129.5&quot; text-anchor=&quot;end&quot;&gt;Azure (224)&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;144.5&quot; text-anchor=&quot;end&quot;&gt;14× less&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;114&quot; width=&quot;175.64757709251103&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;351.647577092511&quot; y=&quot;126.5&quot;&gt;112.0 MB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;133&quot; width=&quot;12.546255506607931&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;188.54625550660793&quot; y=&quot;145.5&quot;&gt;8.0 MB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;g&gt;&lt;text x=&quot;156&quot; y=&quot;180.5&quot; text-anchor=&quot;end&quot;&gt;Cloudflare (129)&lt;/text&gt;&lt;text x=&quot;156&quot; y=&quot;195.5&quot; text-anchor=&quot;end&quot;&gt;24× less&lt;/text&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;165&quot; width=&quot;119.18942731277532&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;295.1894273127753&quot; y=&quot;177.5&quot;&gt;76.0 MB&lt;/text&gt;&lt;/g&gt;&lt;g&gt;&lt;rect x=&quot;170&quot; y=&quot;184&quot; width=&quot;5.018502202643172&quot; height=&quot;16&quot; rx=&quot;3&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;181.01850220264316&quot; y=&quot;196.5&quot;&gt;3.2 MB&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;line x1=&quot;170&quot; x2=&quot;170&quot; y1=&quot;6&quot; y2=&quot;206&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;p&gt;Import time fell too: AWS from 1.61 s to 0.14 s, Cloudflare from 0.63 s to 0.05 s.&lt;/p&gt;&lt;/figure&gt;
&lt;figure data-nosnippet=&quot;&quot;&gt;&lt;figcaption&gt;&lt;span&gt;Heap, provider imported&lt;/span&gt;&lt;span&gt; · total over all providers · lower is better&lt;/span&gt;&lt;span&gt;Retained V8 heap after importing every service module of each provider in a fresh Node process.&lt;/span&gt;&lt;/figcaption&gt;&lt;svg viewBox=&quot;0 0 560 320&quot; role=&quot;img&quot;&gt;&lt;defs&gt;&lt;clipPath id=&quot;bench-clip-15&quot;&gt;&lt;rect x=&quot;86&quot; y=&quot;16&quot; width=&quot;458&quot; height=&quot;246&quot;&gt;&lt;/rect&gt;&lt;/clipPath&gt;&lt;/defs&gt;&lt;rect x=&quot;215.43478260869566&quot; y=&quot;22&quot; width=&quot;328.5652173913044&quot; height=&quot;234&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;221.43478260869566&quot; y=&quot;15&quot;&gt;this work →&lt;/text&gt;&lt;text x=&quot;209.43478260869566&quot; y=&quot;15&quot; text-anchor=&quot;end&quot;&gt;← before&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;256&quot; y2=&quot;256&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;260&quot; text-anchor=&quot;end&quot;&gt;0 B&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;197.5&quot; y2=&quot;197.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;201.5&quot; text-anchor=&quot;end&quot;&gt;250.0 MB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;139&quot; y2=&quot;139&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;143&quot; text-anchor=&quot;end&quot;&gt;500.0 MB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;80.5&quot; y2=&quot;80.5&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;84.5&quot; text-anchor=&quot;end&quot;&gt;750.0 MB&lt;/text&gt;&lt;line x1=&quot;86&quot; x2=&quot;544&quot; y1=&quot;22&quot; y2=&quot;22&quot;&gt;&lt;/line&gt;&lt;text x=&quot;78&quot; y=&quot;26&quot; text-anchor=&quot;end&quot;&gt;1000.0 MB&lt;/text&gt;&lt;polyline clip-path=&quot;url(#bench-clip-15)&quot; points=&quot;210.5,39.8 409.6,184.9 419.5,186.6 429.5,187.5 439.5,187.1 449.4,187.2 459.4,187.2 469.3,187.3 479.3,204.6 489.2,211.1 499.2,210.7 509.2,210.6 519.1,217.2 529.1,217.9 539.0,233.9&quot;&gt;&lt;/polyline&gt;&lt;circle cx=&quot;479.3&quot; cy=&quot;204.6&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#40 Merge branch &apos;exp/data-tables&apos; into perf/sdk-footprint: 219.6 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;489.2&quot; cy=&quot;211.1&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#41 chore: remove scratch bundle output committed by mistake: 192.0 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;519.1&quot; cy=&quot;217.2&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#44 Merge branch &apos;exp/lazy-errors&apos; into perf/sdk-footprint: 165.9 MB&lt;/title&gt;&lt;/circle&gt;&lt;circle cx=&quot;539.0&quot; cy=&quot;233.9&quot; r=&quot;4.5&quot;&gt;&lt;title&gt;#46 perf(build): lazy stubs write each export name once and import one package helper: 94.4 MB&lt;/title&gt;&lt;/circle&gt;&lt;text x=&quot;217.45652173913044&quot; y=&quot;31.772054768000004&quot;&gt;924.1 MB&lt;/text&gt;&lt;text x=&quot;532.0217391304348&quot; y=&quot;223.907022912&quot; text-anchor=&quot;end&quot;&gt;94.4 MB&lt;/text&gt;&lt;text transform=&quot;translate(103.93478260869566,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;5358d66&lt;/text&gt;&lt;text transform=&quot;translate(123.84782608695653,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;14d9302&lt;/text&gt;&lt;text transform=&quot;translate(143.7608695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;751b30b&lt;/text&gt;&lt;text transform=&quot;translate(163.67391304347825,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;e02e9d4&lt;/text&gt;&lt;text transform=&quot;translate(183.58695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d6ae0c8&lt;/text&gt;&lt;text transform=&quot;translate(203.5,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;cced62a&lt;/text&gt;&lt;text transform=&quot;translate(223.41304347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be83014&lt;/text&gt;&lt;text transform=&quot;translate(243.32608695652175,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;2298266&lt;/text&gt;&lt;text transform=&quot;translate(263.2391304347826,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;be75448&lt;/text&gt;&lt;text transform=&quot;translate(283.1521739130435,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;b2297ea&lt;/text&gt;&lt;text transform=&quot;translate(303.0652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c5ca2e9&lt;/text&gt;&lt;text transform=&quot;translate(322.97826086956525,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;bf8b544&lt;/text&gt;&lt;text transform=&quot;translate(342.8913043478261,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;954ca6b&lt;/text&gt;&lt;text transform=&quot;translate(362.804347826087,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1bc7899&lt;/text&gt;&lt;text transform=&quot;translate(382.71739130434787,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;d2d5f33&lt;/text&gt;&lt;text transform=&quot;translate(402.63043478260875,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;c0e8b9d&lt;/text&gt;&lt;text transform=&quot;translate(422.54347826086956,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1eae38c&lt;/text&gt;&lt;text transform=&quot;translate(442.45652173913044,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;3a43095&lt;/text&gt;&lt;text transform=&quot;translate(462.3695652173913,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;03057c5&lt;/text&gt;&lt;text transform=&quot;translate(482.2826086956522,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f966856&lt;/text&gt;&lt;text transform=&quot;translate(502.19565217391306,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;1247e05&lt;/text&gt;&lt;text transform=&quot;translate(522.108695652174,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;54eedde&lt;/text&gt;&lt;text transform=&quot;translate(542.0217391304348,268) rotate(-55)&quot; text-anchor=&quot;end&quot;&gt;f6019b3&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt;
&lt;p&gt;The same metric summed over every provider: 924 MB at the start of the
branch, 94 MB at the end.&lt;/p&gt;
&lt;p&gt;Most of what’s left for AWS is V8 itself. Every module Node loads
costs about 4.8 KB, and every named export about 325 bytes, even if
nothing reads it. All of AWS is 438 modules and tens of thousands of
exports, which comes to about 10 MB before any distilled code runs.
The only way below that is to export fewer names, which is an API
change.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;breaking-changes&quot;&gt;Breaking changes&lt;/h2&gt;&lt;/div&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;These shipped in &lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/*&lt;/code&gt; &lt;code dir=&quot;auto&quot;&gt;1.0.0-rc.16&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Schema values are no longer exported. Use &lt;code dir=&quot;auto&quot;&gt;op.input&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;op.output&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Error classes do not validate their fields on construction.
&lt;code dir=&quot;auto&quot;&gt;ParseError.cause&lt;/code&gt; is a &lt;code dir=&quot;auto&quot;&gt;SchemaMismatch&lt;/code&gt; with a path.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;SigV4.SigningKeyCache&lt;/code&gt; is a plain store.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;lib/&lt;/code&gt; is bundled, minified, generated output.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;instanceof&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;_tag&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Effect.catchTag&lt;/code&gt; and the TypeScript types for
errors work as before.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;try-meta-tree-shaking-in-alchemy&quot;&gt;Try meta tree shaking in Alchemy&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The Alchemy CLI ships with meta tree shaking turned off. To opt in,
pass &lt;code dir=&quot;auto&quot;&gt;--fast-distilled&lt;/code&gt;, or set &lt;code dir=&quot;auto&quot;&gt;ALCHEMY_FAST_DISTILLED=1&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;alchemy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--fast-distilled&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 flag makes the CLI load distilled with the &lt;code dir=&quot;auto&quot;&gt;distilled-lazy&lt;/code&gt;
condition, so every provider your app imports starts as a stub. It
applies under Node. Under Bun it has no effect.&lt;/p&gt;</content:encoded></item><item><title>2.0.0-beta.84 - Monorepo, Domain &amp; Faster Distilled</title><link>https://alchemy.run/blog/2026-10-22-beta-84/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-10-22-beta-84/</guid><description>One package per provider, bindings that work from any cloud, @alchemy.run/domain, faster distilled SDKs, and Cloudflare OAuth that can create Account API Tokens.</description><pubDate>Thu, 22 Oct 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.84 &lt;strong&gt;splits &lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt; into one package per provider&lt;/strong&gt;, so you install &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/aws&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/cloudflare&lt;/code&gt;
next to &lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt; instead of importing &lt;code dir=&quot;auto&quot;&gt;alchemy/AWS&lt;/code&gt;. Every AWS, GCP and
Cloudflare binding now works from any host, so a Worker can call SQS and a
Lambda can write to R2.&lt;/p&gt;
&lt;p&gt;It also adds &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/domain&lt;/code&gt;&lt;/strong&gt;, a domain-driven design framework that
runs on Durable Objects, and &lt;strong&gt;rebuilt distilled SDKs&lt;/strong&gt; that
add 5–100× less overhead per call than the official AWS, Cloudflare and GCP
SDKs, in bundles a third smaller than before. On AWS, there are &lt;strong&gt;Lambda Web
Functions&lt;/strong&gt; with canary deploys. On Cloudflare, &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; for Vite
sites now behaves like &lt;code dir=&quot;auto&quot;&gt;@cloudflare/vite-plugin&lt;/code&gt;&lt;/strong&gt;, and the runtime bindings
use a lot less CPU.&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;Providers moved into their own packages&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2348&quot;&gt;#2348&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2316&quot;&gt;#2316&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2313&quot;&gt;#2313&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2311&quot;&gt;#2311&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2309&quot;&gt;#2309&lt;/a&gt;). Install the
packages you use and update your imports. See
&lt;a href=&quot;#one-package-per-provider&quot;&gt;below&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;State store commands moved under &lt;code dir=&quot;auto&quot;&gt;alchemy state&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2288&quot;&gt;#2288&lt;/a&gt;). The old
commands print the new one and exit 1:&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;# Cloudflare state store&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;provider&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;bootstrap&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;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bootstrap&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;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;prisma&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generate&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;provider&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;generate&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 CI, a missing or outdated state store fails unless you pass &lt;code dir=&quot;auto&quot;&gt;--yes&lt;/code&gt;.
&lt;code dir=&quot;auto&quot;&gt;AWS.state({ name })&lt;/code&gt; is now a short logical name. Use &lt;code dir=&quot;auto&quot;&gt;bucketName&lt;/code&gt; to
pass a full bucket name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.isBindingHost&lt;/code&gt; is removed&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2260&quot;&gt;#2260&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2347&quot;&gt;#2347&lt;/a&gt;). Custom AWS
bindings use &lt;code dir=&quot;auto&quot;&gt;AWSBindings.Bind&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;AWSBindings.withCredentials&lt;/code&gt;. EC2,
LaunchTemplate, AppRunner and Batch hosts now get IAM grants, so they
plan new IAM resources on the next deploy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Distilled error classes are no longer Effect Schemas&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2345&quot;&gt;#2345&lt;/a&gt;). Match them
with their &lt;code dir=&quot;auto&quot;&gt;is&lt;/code&gt; guard. Generated request and response schemas are no
longer exported; reach them through the operation:&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;// match a distilled error&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TooManyRequests&lt;/span&gt;&lt;span&gt;)(error)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;TooManyRequests&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt;(error)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;PutDispatchNamespaceScriptRequest&lt;/span&gt;&lt;span&gt;.ast&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;putDispatchNamespaceScript&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;.ast&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;Prisma and Neon env values use the runtime wire format&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2244&quot;&gt;#2244&lt;/a&gt;). Reading
them through &lt;code dir=&quot;auto&quot;&gt;Prisma.Connect&lt;/code&gt; or the Neon clients is unchanged. Code
that reads &lt;code dir=&quot;auto&quot;&gt;process.env&lt;/code&gt; directly sees secrets as
&lt;code dir=&quot;auto&quot;&gt;{&quot;_tag&quot;:&quot;Redacted&quot;,&quot;value&quot;:&quot;…&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AWS framework sites run on Web Functions by default&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2282&quot;&gt;#2282&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2300&quot;&gt;#2300&lt;/a&gt;). The next
deploy creates a &lt;code dir=&quot;auto&quot;&gt;WebServer&lt;/code&gt; Web Function and deletes the old server
Lambda, keeping the CloudFront distribution and domain. Set
&lt;code dir=&quot;auto&quot;&gt;server: &quot;function&quot;&lt;/code&gt; to keep a Lambda Function URL server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Effect 4.0.5&lt;/strong&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2372&quot;&gt;#2372&lt;/a&gt;).
Bump &lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;@effect/*&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;^4.0.5&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;one-package-per-provider&quot;&gt;One package per provider&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy&lt;/code&gt; keeps the engine, the CLI, and the local and in-memory state
stores. Every cloud and vendor now has its own package, and each one brings
its own resources, bindings and state store, such as &lt;code dir=&quot;auto&quot;&gt;AWS.state()&lt;/code&gt; or
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.state()&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2348&quot;&gt;#2348&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2316&quot;&gt;#2316&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2313&quot;&gt;#2313&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2311&quot;&gt;#2311&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2309&quot;&gt;#2309&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;https://pkg.alchemy.run/alchemy/bea0366&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pkg.alchemy.run/@alchemy.run/cloudflare/bea0366&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pkg.alchemy.run/@alchemy.run/aws/bea0366&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;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;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;AWS&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/AWS&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;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;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;Neon&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/Neon&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&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;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/SQL/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;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;AWS&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/aws&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;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.run/cloudflare&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;Neon&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/neon&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.run/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;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/sql/Postgres&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 same goes for &lt;code dir=&quot;auto&quot;&gt;gcp&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;fly&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;railway&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;hetzner&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;prisma&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;planetscale&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;turso&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;stripe&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;github&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;git&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;acme&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;axiom&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;doppler&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;infisical&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;docker&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;kubernetes&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;redis&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;domain&lt;/code&gt;.
Each package exports its directories and files, so
&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/aws/S3&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/aws/S3/Bucket&lt;/code&gt; both resolve.&lt;/p&gt;
&lt;p&gt;A few things moved within packages:&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.run/cloudflare&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;solver&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ACME&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;ZoneSolver&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;solver&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;ACME&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ZoneSolver&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;Stripe&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;ConsumeEventsLive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Stripe&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConsumeEventsLive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GitHub&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;RepositoryEventSourceLive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RepositoryEventSourceLive&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;ServerHost&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;ServerHost&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/Runtime/Process&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;LibSQL&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/LibSQL&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;LibSQL&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/sql/SQLite&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 CLI finds each provider’s auth, state store and &lt;code dir=&quot;auto&quot;&gt;alchemy provider&lt;/code&gt;
commands once your project depends on its package, through a new
&lt;code dir=&quot;auto&quot;&gt;Contributions&lt;/code&gt; module
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2288&quot;&gt;#2288&lt;/a&gt;). Named state
stores come with 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;state&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;state&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;team-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;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;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bootstrap&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;cloudflare&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;team-a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Runtime bundles shrank along the way. A Worker no longer bundles the
stack builder or CLI auth code (346 KB → 216 KB,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2240&quot;&gt;#2240&lt;/a&gt;), and a Lambda
that imports the Cloudflare barrel drops from 3.26 MB to 0.84 MB
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2267&quot;&gt;#2267&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;, who did most of this
split!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;oauth-can-now-create-account-api-tokens&quot;&gt;OAuth can now create Account API Tokens&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare OAuth can now grant &lt;strong&gt;Account API Token Provisioning&lt;/strong&gt;, so
alchemy can mint scoped API tokens on your behalf. To add it, re-run the
Cloudflare login and pick &lt;strong&gt;All Scopes&lt;/strong&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;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;--reconfigure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then turn the scope on under &lt;strong&gt;Sensitive scopes&lt;/strong&gt; on Cloudflare’s consent
page. It’s off by default:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://alchemy.run/cloudflare/oauth-api-token-provisioning.png&quot; alt=&quot;Cloudflare’s consent page with the Account API Token Provisioning toggle under Sensitive scopes&quot;&gt;&lt;/p&gt;
&lt;p&gt;Login now goes through the Cloudflare CLI’s (&lt;code dir=&quot;auto&quot;&gt;cf&lt;/code&gt;) OAuth client with device
auth, the same flow as &lt;code dir=&quot;auto&quot;&gt;cf login&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2444&quot;&gt;#2444&lt;/a&gt;). Existing
profiles keep refreshing.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/setup&quot;&gt;Cloudflare setup&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;every-binding-works-from-every-cloud&quot;&gt;Every binding works from every cloud&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;In beta.83, only the S3, Lambda and DynamoDB bindings worked outside AWS,
no GCP binding worked outside GCP, and Cloudflare’s &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; bindings crashed
on any host that wasn’t a Worker. As part of the package split, every
binding now works on any host: all ~2,850 AWS bindings across 205 services
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2260&quot;&gt;#2260&lt;/a&gt;), all 192 GCP
bindings across 57 services
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2347&quot;&gt;#2347&lt;/a&gt;), and every
Cloudflare &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; binding
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2267&quot;&gt;#2267&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;A Cloudflare Worker sends to SQS with the same binding a Lambda uses. You
provide its &lt;code dir=&quot;auto&quot;&gt;*Http&lt;/code&gt; 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;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;AWS&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/aws&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;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.run/cloudflare&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;Effect&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/Effect&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;HttpServerResponse&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/http/HttpServerResponse&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;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;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;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;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;queue&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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;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;hello&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;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;=&gt;&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;queued&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;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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;On AWS hosts, a binding grants its permissions to the host’s own role. On
any other host, such as a Worker or Cloud Run, Alchemy creates a
least-privilege IAM user and role for it and signs each call with that
role. GCP works the same way with a service account and key. The other
direction works too: a Lambda writes to R2 through
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.WriteBucketHttp&lt;/code&gt;, which binds a scoped Cloudflare API token.
Hosts that run as a role or service account leave this code out of their
bundles. Thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/infrastructure-as-effects/binding&quot;&gt;Bindings&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;domain-driven-design-with-alchemyrundomain&quot;&gt;Domain-driven design with &lt;code dir=&quot;auto&quot;&gt;@alchemy.run/domain&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/domain&lt;/code&gt; models your backend in your business’s terms
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2176&quot;&gt;#2176&lt;/a&gt;). Commands ask
for changes, aggregates decide them, and events record what happened.
Views, policies, sagas and projections react to those events. The same
model runs in memory for tests and on Durable Objects in production.&lt;/p&gt;
&lt;p&gt;A command declares its target, input, events, rejections and reply:&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;Domain&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/domain&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MoneyDeposited&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;Domain&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;&quot;MoneyDeposited&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;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;balanceAfter&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;Int&lt;/span&gt;&lt;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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DepositMoney&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;Domain&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;&quot;DepositMoney&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;target&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AccountId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;input&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;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;MoneyDeposited&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rejects&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;NotOpen&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; { balance&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;Int&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;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 aggregate decides it against its current 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;DepositMoney&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; cmd) &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;s&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;Open&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; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NotOpen&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&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;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MoneyDeposited&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;cmd&lt;/span&gt;&lt;span&gt;.amount&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; balanceAfter&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;.balance &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cmd&lt;/span&gt;&lt;span&gt;.amount })]&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 story tests it in memory: given this history, when this command, then
these events.&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;story&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;given&lt;/span&gt;&lt;span&gt;(account&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;AccountOpened&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;sam&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;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;(account&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;DepositMoney&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;100&lt;/span&gt;&lt;span&gt; }))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(account&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;MoneyDeposited&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;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; balanceAfter&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Story&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replied&lt;/span&gt;&lt;span&gt;({ balance&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;/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 Cloudflare, provide &lt;code dir=&quot;auto&quot;&gt;DomainCloudflare.DurableObjects&lt;/code&gt; and every
aggregate, view key and policy gets its own Durable Object. Views are
security boundaries, and clients can watch them live over WebSockets. The
package ships an &lt;code dir=&quot;auto&quot;&gt;alchemy-domain&lt;/code&gt; skill so your coding agent can build a
model with you.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/domain&quot;&gt;Domain&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/domain/cloudflare&quot;&gt;Cloudflare Durable Objects&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;smaller-faster-distilled-sdks&quot;&gt;Smaller, faster distilled SDKs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy’s cloud SDKs come from &lt;a href=&quot;https://github.com/alchemy-run/distilled&quot;&gt;distilled&lt;/a&gt;.
This release picks up a rebuilt distilled
(&lt;a href=&quot;https://github.com/alchemy-run/distilled/pull/873&quot;&gt;distilled#873&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2345&quot;&gt;#2345&lt;/a&gt;) that dedupes
schemas, builds them lazily, and replaces Effect Schema with a lighter
schema tree. Medians over 98 one-auth, one-call programs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundle size (gzip)&lt;/td&gt;
&lt;td&gt;57.1 KB&lt;/td&gt;
&lt;td&gt;38.3 KB&lt;/td&gt;
&lt;td&gt;−33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added latency per call (p50)&lt;/td&gt;
&lt;td&gt;19.5 µs&lt;/td&gt;
&lt;td&gt;4.0 µs&lt;/td&gt;
&lt;td&gt;−79%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import heap&lt;/td&gt;
&lt;td&gt;2.15 MB&lt;/td&gt;
&lt;td&gt;0.57 MB&lt;/td&gt;
&lt;td&gt;−74%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First call (cold)&lt;/td&gt;
&lt;td&gt;4.9 ms&lt;/td&gt;
&lt;td&gt;3.3 ms&lt;/td&gt;
&lt;td&gt;−34%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Importing a whole provider is where it shows most. AWS has 438 services,
GCP 318 and Cloudflare 129:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Import heap&lt;/th&gt;
&lt;th&gt;Import time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;227 MB → 13.9 MB&lt;/td&gt;
&lt;td&gt;1.61 s → 0.14 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP&lt;/td&gt;
&lt;td&gt;111 MB → 9.4 MB&lt;/td&gt;
&lt;td&gt;0.75 s → 0.09 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;76 MB → 3.2 MB&lt;/td&gt;
&lt;td&gt;0.63 s → 0.05 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The packages you install from npm shrink too:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Download (tgz)&lt;/th&gt;
&lt;th&gt;Unpacked&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;@distilled.cloud/aws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;23.3 MB → 19.3 MB&lt;/td&gt;
&lt;td&gt;211 MB → 143 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/gcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;42.3 MB → 36.1 MB&lt;/td&gt;
&lt;td&gt;345 MB → 262 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/cloudflare&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9.5 MB → 5.8 MB&lt;/td&gt;
&lt;td&gt;112 MB → 58 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;faster-than-the-official-sdks&quot;&gt;Faster than the official SDKs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The same calls through the official SDKs: AWS SDK v3, the Stainless-built
&lt;code dir=&quot;auto&quot;&gt;cloudflare&lt;/code&gt; package, and &lt;code dir=&quot;auto&quot;&gt;@google-cloud/storage&lt;/code&gt;. Each official program
imports one client. Each distilled program imports the whole provider and
is still smaller:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Call&lt;/th&gt;
&lt;th&gt;Added latency per call&lt;/th&gt;
&lt;th&gt;Bundle (gzip)&lt;/th&gt;
&lt;th&gt;Import heap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GCP &lt;code dir=&quot;auto&quot;&gt;storage.getBuckets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;674 → &lt;strong&gt;6.2 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;239 → &lt;strong&gt;40 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.1 → &lt;strong&gt;0.7 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 &lt;code dir=&quot;auto&quot;&gt;ListBuckets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;140 → &lt;strong&gt;19 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;157 → &lt;strong&gt;61 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.4 → &lt;strong&gt;1.1 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EC2&lt;/td&gt;
&lt;td&gt;97 → &lt;strong&gt;16 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;265 → &lt;strong&gt;55 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.2 → &lt;strong&gt;1.5 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB&lt;/td&gt;
&lt;td&gt;87 → &lt;strong&gt;14 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;145 → &lt;strong&gt;54 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.3 → &lt;strong&gt;1.0 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;79 → &lt;strong&gt;15 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;141 → &lt;strong&gt;55 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.6 → &lt;strong&gt;1.1 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare &lt;code dir=&quot;auto&quot;&gt;workers.scripts.list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;15.5 → &lt;strong&gt;3.0 µs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;125 → &lt;strong&gt;56 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15.3 → &lt;strong&gt;0.7 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Distilled adds 5–100× less overhead per call, ships bundles 2–6× smaller,
and imports with 3–22× less memory. Its first cold call is faster too, except
on Cloudflare, where it takes 3.4 ms against the official SDK’s 1.9 ms.&lt;/p&gt;
&lt;p&gt;The Cloudflare package now signs R2 presigned URLs
with the standalone &lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/aws4signer&lt;/code&gt;, so it no longer depends
on the AWS SDK (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2370&quot;&gt;#2370&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;plan-and-apply-scale-linearly&quot;&gt;Plan and apply scale linearly&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Plan and apply used to do work proportional to the square of the stack’s
resource count. Apply rebuilt every resource’s outputs once per resource, and
plan scanned every node to find each node’s dependents. Both are now linear
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2419&quot;&gt;#2419&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack shape&lt;/th&gt;
&lt;th&gt;Resources&lt;/th&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;Independent&lt;/td&gt;
&lt;td&gt;4,000&lt;/td&gt;
&lt;td&gt;3.4 s&lt;/td&gt;
&lt;td&gt;1.7 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Independent&lt;/td&gt;
&lt;td&gt;8,000&lt;/td&gt;
&lt;td&gt;9.5 s&lt;/td&gt;
&lt;td&gt;3.8 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 dependencies each&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;1.2 s&lt;/td&gt;
&lt;td&gt;1.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20 dependencies each&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;3.3 s&lt;/td&gt;
&lt;td&gt;2.1 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Timings are engine overhead only, measured with no-op providers. Thanks
&lt;a href=&quot;https://github.com/gpu004&quot;&gt;gpu004&lt;/a&gt; for profiling it!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;foldkit-ssr-and-prerendering&quot;&gt;Foldkit SSR and prerendering&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://foldkit.dev&quot;&gt;Foldkit&lt;/a&gt; apps can now render on the server and
prerender pages, on every website provider
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1313&quot;&gt;#1313&lt;/a&gt;). Turn on
&lt;code dir=&quot;auto&quot;&gt;ssr.build&lt;/code&gt; in the Foldkit Vite plugin:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;vite.config.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;defineConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foldkit&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serverEntry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/src/entry.server.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;clientEntry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/src/entry.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;build&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;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Alchemy deploys the server Foldkit generates and serves prerendered pages
as static files. On Cloudflare, Fly, Hetzner, Railway, Neon, Prisma and
GCP, the build decides whether the site is an SPA, static, SSR or a hybrid:&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;Foldkit&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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;On AWS, you choose between a server and a static site:&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;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;Foldkit&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; { 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;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;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;Foldkit&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; { output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;static&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; errorPage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;404.html&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;Foldkit pairs with &lt;a href=&quot;https://alchemy.run/domain/foldkit&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/domain&lt;/code&gt;&lt;/a&gt; for the
front end of a domain model. Thanks
&lt;a href=&quot;https://github.com/filipfalcon&quot;&gt;Filip Falcon&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/frontend/foldkit&quot;&gt;Foldkit on Cloudflare&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/aws/frontend/foldkit&quot;&gt;Foldkit on AWS&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;lambda-web-functions&quot;&gt;Lambda Web Functions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.WebFunction&lt;/code&gt; runs your HTTP server on &lt;a href=&quot;https://aws.amazon.com/blogs/aws/announcing-aws-lambda-web-functions-for-fast-consistent-web-app-performance-anywhere/&quot;&gt;Lambda Web
Functions&lt;/a&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2243&quot;&gt;#2243&lt;/a&gt;). Each
environment serves up to 128 requests at once, responses stream, and every
function gets an HTTPS endpoint. An Effect Web Function returns &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;,
and existing bindings work 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;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;WebFunction&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; authType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ApplicationManaged&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;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;Uploads&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;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;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;    &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;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;Saved&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;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;/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;Or bring your own server (Hono, Express, &lt;code dir=&quot;auto&quot;&gt;node:http&lt;/code&gt;). It listens on
&lt;code dir=&quot;auto&quot;&gt;AWS_LAMBDA_HTTP_ENDPOINT&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;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;WebFunction&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/server.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;authType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ApplicationManaged&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;regions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;us-east-1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;eu-west-1&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;// one global domain&lt;/span&gt;&lt;/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;canary&lt;/code&gt; sends a share of traffic to each new deploy
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2280&quot;&gt;#2280&lt;/a&gt;). Edit the
weight to promote or roll back:&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;canary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { weight&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// the new revision gets 10%, the previous one 90%&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 server-rendered &lt;code dir=&quot;auto&quot;&gt;AWS.Website&lt;/code&gt; (Nuxt, SvelteKit, Astro, React Router,
SolidStart, TanStack Start, Waku, Octane, Vinext) now runs on a Web
Function by default
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2282&quot;&gt;#2282&lt;/a&gt;). Next.js runs
as its own standalone server with an S3 cache, without OpenNext, SQS or
DynamoDB (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2300&quot;&gt;#2300&lt;/a&gt;).
Existing sites roll forward on the next deploy.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/compute/web-functions&quot;&gt;Web Functions&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/aws/frontend/nextjs&quot;&gt;Next.js&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;effect-workflows-on-every-engine&quot;&gt;Effect workflows on every engine&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Workflows&lt;/code&gt; runs &lt;code dir=&quot;auto&quot;&gt;effect/workflow&lt;/code&gt; workflows on Durable Objects,
Cloudflare Workflows, and Lambda durable functions
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2252&quot;&gt;#2252&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2268&quot;&gt;#2268&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2390&quot;&gt;#2390&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Workflows.layer&lt;/code&gt; implements a workflow. Pass it an Effect that resolves
bindings, here an R2 bucket, and return the handler that uses them:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/Onboard.ts&lt;/span&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.run/cloudflare&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;Workflows&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/Workflows&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;Effect&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/Effect&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;Schema&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/Schema&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;Activity&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DurableClock&lt;/span&gt;&lt;span&gt;,&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;effect/workflow&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;Profiles&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;Profiles&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Onboard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;make&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Onboard&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;payload&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;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;/span&gt;&lt;/span&gt;&lt;span&gt;success&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;idempotencyKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ({ userId }) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;OnboardLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;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;&lt;/span&gt;&lt;span&gt;Onboard&lt;/span&gt;&lt;span&gt;,&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;profiles&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;Profiles&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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; ({ userId }) {&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;Activity&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;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;create-profile&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;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; profiles&lt;/span&gt;&lt;/div&gt;&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;put&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;}.json`&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;({ userId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; plan&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;trial&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;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;// the run suspends for a week and costs nothing while it waits&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;DurableClock&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sleep&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;trial&quot;&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;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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Activity&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;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;end-trial&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;execute&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; profiles&lt;/span&gt;&lt;/div&gt;&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;put&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`${&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;}.json`&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;({ userId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; plan&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;free&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;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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`onboarded ${&lt;/span&gt;&lt;span&gt;userId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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 Worker starts runs with &lt;code dir=&quot;auto&quot;&gt;Workflows.RunWorkflow&lt;/code&gt; and reads them back.
Give it the implementation, the R2 binding and an engine, here Durable
Objects:&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;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.run/cloudflare&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;Workflows&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/Workflows&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;Effect&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/Effect&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;HttpServerRequest&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/http/HttpServerRequest&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;HttpServerResponse&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/http/HttpServerResponse&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;Layer&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/Layer&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;Onboard&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OnboardLive&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;./Onboard.ts&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;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;onboard&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;Workflows&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RunWorkflow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Onboard&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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;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://localhost&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;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.method &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;POST&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;const&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; &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;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;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;onboard&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;userId&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&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;run&lt;/span&gt;&lt;span&gt;.executionId)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;runId&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;run&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;// NotStarted | Running | Completed | Failed | Interrupted | Died&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;status&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;onboard&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;runId&lt;/span&gt;&lt;span&gt;).status&lt;/span&gt;&lt;span&gt;;&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;status&lt;/span&gt;&lt;span&gt;._tag)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;OnboardLive&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;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;WriteBucketBinding&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&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;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;DurableObjectEngine&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Swap &lt;code dir=&quot;auto&quot;&gt;DurableObjectEngine&lt;/code&gt; for &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workflows.NativeEngine&lt;/code&gt; to run
it on Cloudflare Workflows instead. On AWS, host workflows in an
&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.WorkflowFunction&lt;/code&gt; and start them from other functions with
&lt;code dir=&quot;auto&quot;&gt;AWS.Lambda.DurableFunctionEngine&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/effect-workflows&quot;&gt;Cloudflare&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/aws/compute/effect-workflows&quot;&gt;AWS&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;vite-dev-that-matches-cloudflarevite-plugin&quot;&gt;Vite dev that matches &lt;code dir=&quot;auto&quot;&gt;@cloudflare/vite-plugin&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;Website.Vite&lt;/code&gt; Worker now behaves in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; as it does deployed,
and as it does under &lt;code dir=&quot;auto&quot;&gt;@cloudflare/vite-plugin&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2367&quot;&gt;#2367&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2365&quot;&gt;#2365&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2144&quot;&gt;#2144&lt;/a&gt;). Durable
Objects from other Workers, Workflows, Containers, WebSockets, &lt;code dir=&quot;auto&quot;&gt;ctx.access&lt;/code&gt;,
Node.js polyfills, HTTPS dev servers and Wrangler’s &lt;code dir=&quot;auto&quot;&gt;/cdn-cgi/local/*&lt;/code&gt;
endpoints all work in dev. Asset routing follows your &lt;code dir=&quot;auto&quot;&gt;htmlHandling&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;notFoundHandling&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;runWorkerFirst&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;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;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;./api/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;span&gt;assets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { notFoundHandling&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;single-page-application&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; runWorkerFirst&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// dev before: /api/some-file.txt → the file on disk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// dev now:    /api/some-file.txt → the Worker, as deployed&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 Vite config that keeps &lt;code dir=&quot;auto&quot;&gt;cloudflare()&lt;/code&gt; from &lt;code dir=&quot;auto&quot;&gt;@cloudflare/vite-plugin&lt;/code&gt; now
runs, so RedwoodSDK, Flue and the Agents SDK build as documented. Tests
run the official plugin next to Alchemy’s on the same projects and compare
config, build output and runtime behavior. The full list is in
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/packages/cloudflare-runtime/src/vite/PARITY.md&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;PARITY.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The dev server also refuses &lt;code dir=&quot;auto&quot;&gt;.env&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;.dev.vars&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;.alchemy/&lt;/code&gt;, and no
longer forwards a request like &lt;code dir=&quot;auto&quot;&gt;//127.0.0.1:47667/x&lt;/code&gt; to another local port
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2381&quot;&gt;#2381&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/armancharan&quot;&gt;Arman Charan&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;faster-cloudflare-runtime&quot;&gt;Faster Cloudflare runtime&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/danieljvdm&quot;&gt;Dan van der Merwe&lt;/a&gt; measured the runtime
bindings on deployed Workers and Durable Objects and cut their CPU time:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Mean CPU before → after&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copy a 16 MiB R2 object with &lt;code dir=&quot;auto&quot;&gt;get&lt;/code&gt; + &lt;code dir=&quot;auto&quot;&gt;put&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2276&quot;&gt;#2276&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;630 → 3.8 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prepare five 1 MiB Workers AI images (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2274&quot;&gt;#2274&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;270 → 10.6 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000 workflow result round trips (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2271&quot;&gt;#2271&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;358 → 32 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 MiB through the RPC codec (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2272&quot;&gt;#2272&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;85 → 20 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pack 500 queue messages (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2275&quot;&gt;#2275&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;235 → 92 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drain 1,000 Durable Object scheduled events (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2277&quot;&gt;#2277&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;33 → 8.4 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,000 env reads in a Durable Object (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2279&quot;&gt;#2279&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;29 → 4.9 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SQL cursors allocate only what you use
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2281&quot;&gt;#2281&lt;/a&gt;). RPC streams
whose values arrive after the method returns now deliver every value
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2273&quot;&gt;#2273&lt;/a&gt;), and durable
callbacks that keep failing now back off and park after eight attempts
instead of waking forever
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1908&quot;&gt;#1908&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rds-migrations-everywhere&quot;&gt;RDS migrations everywhere&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt; now works on every PostgreSQL, MySQL and MariaDB
&lt;code dir=&quot;auto&quot;&gt;DBInstance&lt;/code&gt;, standalone or Aurora
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2125&quot;&gt;#2125&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2289&quot;&gt;#2289&lt;/a&gt;). Aurora runs
them over the Data API. A public database connects directly, and a
private one runs them from a Lambda in the VPC:&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;runner&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;RDS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MigrationRunner&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;MigrationRunner&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;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;span&gt;securityGroupIds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;runnerSecurityGroup&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;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;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;mysql&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;/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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;migrationsTransport&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; runner&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Thanks &lt;a href=&quot;https://github.com/xofromthemoon&quot;&gt;gegi&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/drizzle-aurora&quot;&gt;Drizzle on Aurora&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;gcp-state-store&quot;&gt;GCP state store&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.state()&lt;/code&gt; keeps deploy state in a Cloud Storage bucket in your project
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2379&quot;&gt;#2379&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;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;MyApp&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;GCP&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;GCP&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;program&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;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;state&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bootstrap&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;gcp&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.state()&lt;/code&gt; now locks each stack and stage too, so two concurrent
deploys of one stage can no longer mix their state
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2145&quot;&gt;#2145&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/armancharan&quot;&gt;Arman Charan&lt;/a&gt;! The GCP docs are rebuilt
around a five-part tutorial
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2374&quot;&gt;#2374&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp&quot;&gt;GCP&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/setup&quot;&gt;GCP setup&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;fly-remote-builds&quot;&gt;Fly remote builds&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt; images now build on Fly’s remote builders, the same ones
&lt;code dir=&quot;auto&quot;&gt;fly deploy&lt;/code&gt; uses (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2472&quot;&gt;#2472&lt;/a&gt;).
Only your bundled app leaves your machine: the builder pulls the base image,
builds, and pushes to &lt;code dir=&quot;auto&quot;&gt;registry.fly.io&lt;/code&gt; right next to it. Deploys no longer
upload the whole ~86 MB &lt;code dir=&quot;auto&quot;&gt;node:26-slim&lt;/code&gt; image for every Service, which made
them slow on home and CI connections. Nothing to change in your stack:&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;// builds on a Fly remote builder&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;Fly&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;Api&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// build and push with your local Docker engine instead&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;Fly&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;Api&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;span&gt; build&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;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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/fly/compute/services&quot;&gt;Fly services&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;&lt;code dir=&quot;auto&quot;&gt;GCP.IAM.ServiceAccount&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;ServiceAccountKey&lt;/code&gt;&lt;/strong&gt; resources
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2347&quot;&gt;#2347&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Hyperdrive.lookup&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1345&quot;&gt;#1345&lt;/a&gt;) binds an
existing Hyperdrive configuration without managing it. Thanks
&lt;a href=&quot;https://github.com/Franz1241&quot;&gt;Franz Rebaza&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;ctx.props&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;ctx.exports&lt;/code&gt;&lt;/strong&gt; in Effect Workers and Durable Objects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2251&quot;&gt;#2251&lt;/a&gt;), and
hibernation &lt;code dir=&quot;auto&quot;&gt;tags&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Cloudflare.upgrade()&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2265&quot;&gt;#2265&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/xofromthemoon&quot;&gt;gegi&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container placement&lt;/strong&gt; &lt;code dir=&quot;auto&quot;&gt;jurisdiction&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;regions&lt;/code&gt; are typed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2253&quot;&gt;#2253&lt;/a&gt;), local
containers can mount FUSE filesystems
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2362&quot;&gt;#2362&lt;/a&gt;), and
detached or adopted container applications redeploy cleanly
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2378&quot;&gt;#2378&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2283&quot;&gt;#2283&lt;/a&gt;). Containers
built from inline Dockerfile content deploy (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2341&quot;&gt;#2341&lt;/a&gt;), and &lt;code dir=&quot;auto&quot;&gt;monitor()&lt;/code&gt;
fails with the same typed placement errors as &lt;code dir=&quot;auto&quot;&gt;start()&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2340&quot;&gt;#2340&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/jakvbs&quot;&gt;Jakub Sieczczyński&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jonbeckman&quot;&gt;Jonathan Beckman&lt;/a&gt;,
&lt;a href=&quot;https://github.com/JustYannicc&quot;&gt;Yannic Charlon&lt;/a&gt; and
&lt;a href=&quot;https://github.com/drwpwrs&quot;&gt;Drew Powers&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;localUploads&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.Bucket&lt;/code&gt;&lt;/strong&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2424&quot;&gt;#2424&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare fixes&lt;/strong&gt;: a failed ruleset read no longer wipes a zone’s
other rules when a Worker sets &lt;code dir=&quot;auto&quot;&gt;domain.redirects&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;version.affinity&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2339&quot;&gt;#2339&lt;/a&gt;),
&lt;code dir=&quot;auto&quot;&gt;WorkerEntrypoint&lt;/code&gt; targets a cross-stack &lt;code dir=&quot;auto&quot;&gt;Worker.ref&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2414&quot;&gt;#2414&lt;/a&gt;), a
rotated &lt;code dir=&quot;auto&quot;&gt;MtlsCertificate&lt;/code&gt; uploads the new PEM (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2428&quot;&gt;#2428&lt;/a&gt;), and a
Hyperdrive config replaces when its CA pin is dropped (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2429&quot;&gt;#2429&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/drwpwrs&quot;&gt;Drew Powers&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare website builds receive &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt;&lt;/strong&gt;, so &lt;code dir=&quot;auto&quot;&gt;NEXT_PUBLIC_*&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;VITE_*&lt;/code&gt; and similar values reach the client bundle
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2238&quot;&gt;#2238&lt;/a&gt;), and a full
Worker deploy returns its &lt;code dir=&quot;auto&quot;&gt;versionId&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;deploymentId&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2241&quot;&gt;#2241&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/kevinquack0&quot;&gt;Kevin&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local dev fixes&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;/.well-known/&lt;/code&gt; assets serve
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2212&quot;&gt;#2212&lt;/a&gt;), large D1
migrations and &lt;code dir=&quot;auto&quot;&gt;importFiles&lt;/code&gt; apply
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2380&quot;&gt;#2380&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2258&quot;&gt;#2258&lt;/a&gt;), &lt;code dir=&quot;auto&quot;&gt;publicDir&lt;/code&gt;
files serve through &lt;code dir=&quot;auto&quot;&gt;ASSETS&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2290&quot;&gt;#2290&lt;/a&gt;),
&lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; takes &lt;code dir=&quot;auto&quot;&gt;dev.port&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2331&quot;&gt;#2331&lt;/a&gt;), tail
consumers receive events and each Worker gets its own Cache store
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2383&quot;&gt;#2383&lt;/a&gt;), port
probes stay on loopback
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2237&quot;&gt;#2237&lt;/a&gt;), and early
responses no longer reset the connection
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2242&quot;&gt;#2242&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/birbprophet&quot;&gt;birbprophet&lt;/a&gt;,
&lt;a href=&quot;https://github.com/altaywtf&quot;&gt;Altay&lt;/a&gt;,
&lt;a href=&quot;https://github.com/kevinquack0&quot;&gt;Kevin&lt;/a&gt; and
&lt;a href=&quot;https://github.com/mcr5fh&quot;&gt;Matthew Ruiters&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare deploys on Node 26&lt;/strong&gt; use HTTP/1.1 for API calls, avoiding
stream resets (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2155&quot;&gt;#2155&lt;/a&gt;),
and Durable Object RPC retries through deploy propagation
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2294&quot;&gt;#2294&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;metadataOptions&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;AWS.EC2.Instance&lt;/code&gt;&lt;/strong&gt; and &lt;code dir=&quot;auto&quot;&gt;LaunchTemplate&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2426&quot;&gt;#2426&lt;/a&gt;), &lt;code dir=&quot;auto&quot;&gt;Redacted&lt;/code&gt; &lt;code dir=&quot;auto&quot;&gt;userData&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;Instance&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2421&quot;&gt;#2421&lt;/a&gt;), and a VPC
whose create was interrupted is recovered instead of leaked
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2416&quot;&gt;#2416&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.RDS.Aurora&lt;/code&gt; accepts Outputs&lt;/strong&gt; for &lt;code dir=&quot;auto&quot;&gt;kmsKeyId&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2364&quot;&gt;#2364&lt;/a&gt;). Thanks &lt;a href=&quot;https://github.com/xofromthemoon&quot;&gt;gegi&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS fixes&lt;/strong&gt;: &lt;code dir=&quot;auto&quot;&gt;Lambda.KafkaEventSource&lt;/code&gt; grants the EC2 permissions MSK
mappings need (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2401&quot;&gt;#2401&lt;/a&gt;), &lt;code dir=&quot;auto&quot;&gt;EMRContainers.VirtualCluster&lt;/code&gt; waits for a new
EKS cluster’s connection (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2412&quot;&gt;#2412&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;DataZone.EnvironmentBlueprintConfiguration&lt;/code&gt; removes the Lake Formation
admins DataZone added (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2411&quot;&gt;#2411&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~200 more AWS resources run on &lt;a href=&quot;https://alchemy.run/aws/local-development&quot;&gt;floci&lt;/a&gt;&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/1803&quot;&gt;#1803&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AgentCore Runtime V2&lt;/strong&gt; with &lt;code dir=&quot;auto&quot;&gt;platformVersion&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2301&quot;&gt;#2301&lt;/a&gt;), ECS dev
watcher keeps the recorded task definition
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2091&quot;&gt;#2091&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/Henrymarks1&quot;&gt;Henry Marks&lt;/a&gt; and
&lt;a href=&quot;https://github.com/TBIQ007&quot;&gt;TBIQ007&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Railway ephemeral environments&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2117&quot;&gt;#2117&lt;/a&gt;) and a 768 MiB
Prisma Compute upload cap
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2257&quot;&gt;#2257&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/mbirkegaard&quot;&gt;Mikkel&lt;/a&gt; and
&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;GitHub.consumeRepositoryEvents&lt;/code&gt; generates a webhook secret&lt;/strong&gt; when you
omit one, so every delivery’s signature is checked (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1932&quot;&gt;#1932&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;GitHub.Ruleset&lt;/code&gt; takes &lt;code dir=&quot;auto&quot;&gt;allowedMergeMethods&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;requireExtraApprovalForUnattributedChanges&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2397&quot;&gt;#2397&lt;/a&gt;) and adopts an
existing ruleset by name (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2129&quot;&gt;#2129&lt;/a&gt;), and &lt;code dir=&quot;auto&quot;&gt;GitHub.BranchProtection&lt;/code&gt;
deploys with &lt;code dir=&quot;auto&quot;&gt;requiredStatusChecks.checks&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2076&quot;&gt;#2076&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/jasonkuhrt&quot;&gt;Jason Kuhrt&lt;/a&gt;,
&lt;a href=&quot;https://github.com/pattobrien&quot;&gt;Patt O’Brien&lt;/a&gt; and
&lt;a href=&quot;https://github.com/armancharan&quot;&gt;Arman Charan&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core fixes&lt;/strong&gt;: declaring a logical id already used by another type fails
with &lt;code dir=&quot;auto&quot;&gt;DuplicateLogicalIdError&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2063&quot;&gt;#2063&lt;/a&gt;), &lt;code dir=&quot;auto&quot;&gt;afterAll(destroy(Stack))&lt;/code&gt; no
longer hangs under Vitest (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2142&quot;&gt;#2142&lt;/a&gt;), a &lt;code dir=&quot;auto&quot;&gt;Docker.Context&lt;/code&gt; missing from a
fresh CI runner is re-created (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2187&quot;&gt;#2187&lt;/a&gt;), log redaction no longer leaks
the tail of a secret that extends a shorter one (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2418&quot;&gt;#2418&lt;/a&gt;), tarballs keep
long non-ASCII file names intact (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2420&quot;&gt;#2420&lt;/a&gt;), and &lt;code dir=&quot;auto&quot;&gt;alchemy/State&lt;/code&gt;
type-checks under &lt;code dir=&quot;auto&quot;&gt;exactOptionalPropertyTypes&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2413&quot;&gt;#2413&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/armancharan&quot;&gt;Arman Charan&lt;/a&gt; and
&lt;a href=&quot;https://github.com/pattobrien&quot;&gt;Patt O’Brien&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The CLI runs on Node 22.22.3+&lt;/strong&gt; again (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2403&quot;&gt;#2403&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;alchemy profile refresh --provider&lt;/code&gt; matches case-insensitively
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2410&quot;&gt;#2410&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;&lt;code dir=&quot;auto&quot;&gt;alchemy profile&lt;/code&gt;&lt;/strong&gt; no longer crashes with &lt;code dir=&quot;auto&quot;&gt;Cannot find package &apos;react&apos;&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2295&quot;&gt;#2295&lt;/a&gt;), and Workers
bundle less core code
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2240&quot;&gt;#2240&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/birbprophet&quot;&gt;birbprophet&lt;/a&gt; and
&lt;a href=&quot;https://github.com/schutzelaars&quot;&gt;Juliaan&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/getting-started&quot;&gt;Getting started&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/setup&quot;&gt;Cloudflare setup&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/setup&quot;&gt;AWS setup&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/setup&quot;&gt;GCP setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/domain&quot;&gt;Domain&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/domain/tutorial/part-1&quot;&gt;Domain tutorial&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/frontend/foldkit&quot;&gt;Foldkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/aws/compute/web-functions&quot;&gt;Web Functions&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/frontend/nextjs&quot;&gt;Next.js on AWS&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/data/rds&quot;&gt;RDS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/effect-workflows&quot;&gt;Effect workflows on Cloudflare&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/compute/effect-workflows&quot;&gt;on AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/frontend/vite&quot;&gt;Vite on Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta84&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.83...v2.0.0-beta.84&quot;&gt;Compare v2.0.0-beta.83 → v2.0.0-beta.84&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.83 - Cloudflare Birthday Week</title><link>https://alchemy.run/blog/2026-10-12-beta-83/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-10-12-beta-83/</guid><description>v2.0.0-beta.83 supports Cloudflare&apos;s Birthday Week launches — containers managed by Durable Objects, K2 event streams, Basin, Workers KV Instant, Workers Issues, and vinext 1.0 — plus Hyperdrive to private databases over Workers VPC, per-entrypoint Workers Cache, Durable Objects deployed with exports, federated APIs, and adopting Cloudflare Access apps. Also a Turso provider, AWS console login, DSQL migrations, Neon roles, and 93 bug fixes.</description><pubDate>Mon, 12 Oct 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.83 supports Cloudflare’s &lt;strong&gt;Birthday Week&lt;/strong&gt; launches. Containers can now
be &lt;strong&gt;managed by Durable Objects&lt;/strong&gt;: bind one Container per image and start
the one you need. &lt;strong&gt;K2&lt;/strong&gt; gives you durable event streams, and &lt;strong&gt;Basin&lt;/strong&gt; turns
Pipelines and the R2 Data Catalog into one data platform. &lt;strong&gt;Workers KV
Instant&lt;/strong&gt;, &lt;strong&gt;Workers Issues&lt;/strong&gt;, and &lt;strong&gt;vinext 1.0&lt;/strong&gt; work out of the box.&lt;/p&gt;
&lt;p&gt;Outside Birthday Week, Workers can reach &lt;strong&gt;private databases through
Hyperdrive and Workers VPC&lt;/strong&gt;, set &lt;strong&gt;Workers Cache per entrypoint&lt;/strong&gt;, and
serve one hostname from many Workers with &lt;strong&gt;federated APIs&lt;/strong&gt;, and take over
existing &lt;strong&gt;Cloudflare Access&lt;/strong&gt; apps. Durable
Objects now deploy with Cloudflare’s &lt;strong&gt;declarative exports&lt;/strong&gt;. Kubernetes resources send &lt;code dir=&quot;auto&quot;&gt;Redacted&lt;/code&gt;
secrets to the cluster. There is also a new &lt;strong&gt;Turso&lt;/strong&gt; provider, &lt;strong&gt;AWS console login&lt;/strong&gt;, &lt;strong&gt;DSQL migrations&lt;/strong&gt;,
and &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Neon.Role&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It also ships &lt;strong&gt;93 bug fixes&lt;/strong&gt; and closes 51 issues. See
&lt;a href=&quot;#93-bug-fixes&quot;&gt;Bug fixes&lt;/a&gt;. This post covers beta.82 and beta.83.&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;Containers start explicitly, and one Container is one image&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1905&quot;&gt;#1905&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2223&quot;&gt;#2223&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Containers.layer&lt;/code&gt; is removed. &lt;code dir=&quot;auto&quot;&gt;yield* Sandbox&lt;/code&gt; binds the
container without starting it; call &lt;code dir=&quot;auto&quot;&gt;sandbox.start()&lt;/code&gt; before you use
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;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;span&gt;return&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;sandbox&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;/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;start&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;start&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;return&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;start&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;andThen&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;ping&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 Durable Object-managed Container declares a single &lt;code dir=&quot;auto&quot;&gt;image&lt;/code&gt; (or
&lt;code dir=&quot;auto&quot;&gt;dockerfile&lt;/code&gt;). The &lt;code dir=&quot;auto&quot;&gt;images&lt;/code&gt; map from beta.82 is removed: declare one
Container per image and bind each to the Durable Object. On an async
Worker, the Container’s &lt;code dir=&quot;auto&quot;&gt;className&lt;/code&gt; is replaced by the Durable Object
binding’s &lt;code dir=&quot;auto&quot;&gt;containers&lt;/code&gt;, and a Durable Object-managed Container placed
directly in &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; fails with &lt;code dir=&quot;auto&quot;&gt;DurableObjectContainerBindingError&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;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;AGENT&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;Agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Python&lt;/span&gt;&lt;span&gt;] })&lt;/span&gt;&lt;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;A container’s
RPC shape can no longer declare members the handle already has (&lt;code dir=&quot;auto&quot;&gt;start&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;exec&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;image&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;getTcpPort&lt;/code&gt;, …), and RPC on a stopped container fails
with &lt;code dir=&quot;auto&quot;&gt;ContainerNotRunningError&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipelines streams are private by default&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2010&quot;&gt;#2010&lt;/a&gt;). A
&lt;code dir=&quot;auto&quot;&gt;Pipelines.Stream&lt;/code&gt; declared without &lt;code dir=&quot;auto&quot;&gt;http&lt;/code&gt; no longer gets a public,
unauthenticated ingest endpoint. Set
&lt;code dir=&quot;auto&quot;&gt;http: { enabled: true, authentication: false }&lt;/code&gt; to keep one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Durable Objects deploy with &lt;code dir=&quot;auto&quot;&gt;exports&lt;/code&gt;, and you can’t go back&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2135&quot;&gt;#2135&lt;/a&gt;). After a
Worker with Durable Objects deploys on beta.82, older Alchemy releases
can no longer deploy it. Upgrade every machine and CI job that deploys
the stack together. The first deploy after upgrading must go out at
100% traffic. See &lt;a href=&quot;#durable-objects-deploy-with-exports&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;InstanceId&lt;/code&gt; is now &lt;code dir=&quot;auto&quot;&gt;ResourceContext&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2160&quot;&gt;#2160&lt;/a&gt;). Custom
providers read the instance id from the resource 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;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;Effect&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/Effect&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;InstanceId&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;instanceId&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;InstanceId&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;ResourceContext&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;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;instanceId&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;ResourceContext&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;The CLI needs Node 24.11.1+ or Bun&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2151&quot;&gt;#2151&lt;/a&gt;). Node 22
and 23 are no longer supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bundles are written to &lt;code dir=&quot;auto&quot;&gt;.alchemy/bundles&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2133&quot;&gt;#2133&lt;/a&gt;), not
&lt;code dir=&quot;auto&quot;&gt;dist/&lt;/code&gt;. Workers and Lambdas redeploy once after you upgrade because
their sourcemap paths change. Set &lt;code dir=&quot;auto&quot;&gt;build.output.dir&lt;/code&gt; to choose a
location.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Git.BlobStoreR2&lt;/code&gt; needs a &lt;code dir=&quot;auto&quot;&gt;ReadWriteBucket&lt;/code&gt; implementation&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2102&quot;&gt;#2102&lt;/a&gt;). Provide
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.ReadWriteBucketBinding&lt;/code&gt; (or &lt;code dir=&quot;auto&quot;&gt;ReadWriteBucketHttp&lt;/code&gt;) on
the Worker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Removed GCP resources&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2159&quot;&gt;#2159&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2024&quot;&gt;#2024&lt;/a&gt;). Google
removed the APIs behind &lt;code dir=&quot;auto&quot;&gt;GCP.WorkspaceEvents.TasksPushNotificationConfig&lt;/code&gt;
and the &lt;code dir=&quot;auto&quot;&gt;GCP.Dataplex&lt;/code&gt; data taxonomy resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;An &lt;code dir=&quot;auto&quot;&gt;MtlsCertificate&lt;/code&gt; in &lt;code dir=&quot;auto&quot;&gt;env&lt;/code&gt; is an mTLS binding&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2051&quot;&gt;#2051&lt;/a&gt;), typed as a
&lt;code dir=&quot;auto&quot;&gt;Fetcher&lt;/code&gt;, instead of a JSON binding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflare-birthday-week&quot;&gt;Cloudflare Birthday Week&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;containers-managed-by-durable-objects&quot;&gt;Containers managed by Durable Objects&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare rebuilt Containers so a Durable Object can start one directly
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1905&quot;&gt;#1905&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2223&quot;&gt;#2223&lt;/a&gt;). Declare one
Container per image with &lt;code dir=&quot;auto&quot;&gt;schedulingPolicy: &quot;durable_object&quot;&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;Node&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;span&gt;Node&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Node&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;schedulingPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;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;&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;node:24-slim&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Python&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;span&gt;Python&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;Python&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;schedulingPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;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;&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;./python/Dockerfile&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;context&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./python&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;Bind as many as you need in the Durable Object. Each handle’s &lt;code dir=&quot;auto&quot;&gt;start()&lt;/code&gt;
starts its own image, with the instance size and entrypoint you choose:&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;Agent&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;Agent&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;Agent&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;node&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;Node&lt;/span&gt;&lt;span&gt;;&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;python&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;Python&lt;/span&gt;&lt;span&gt;;&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;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;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;/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;node&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;instance&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;lite&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;entrypoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;sleep&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;infinity&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;enableInternet&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;})&lt;/span&gt;&lt;span&gt;;&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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node&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;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;}).&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;.scoped)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;A Durable Object runs one container at a time, so start one image and
&lt;code dir=&quot;auto&quot;&gt;destroy()&lt;/code&gt; it before you switch.&lt;/p&gt;
&lt;p&gt;A plain async Durable Object lists its Containers on its binding. A
Container can back several classes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;alchemy.run.ts&lt;/span&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;Node&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;Container&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Node&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;schedulingPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;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;&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;node:24-slim&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;Python&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;Container&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Python&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;schedulingPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;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;&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;python:3.13-slim&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;Rust&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;Container&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Rust&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;schedulingPolicy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;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;&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;rust:1.90-slim&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;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;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;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.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;AGENT&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;Agent&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Python&lt;/span&gt;&lt;span&gt;] })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;REVIEWER&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;Reviewer&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Rust&lt;/span&gt;&lt;span&gt;] })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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 class finds each image in &lt;code dir=&quot;auto&quot;&gt;ctx.container.images&lt;/code&gt; under its
Container’s id:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/worker.ts&lt;/span&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;DurableObject&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;cloudflare:workers&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Agent&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;DurableObject&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/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; this.&lt;/span&gt;&lt;span&gt;ctx&lt;/span&gt;&lt;span&gt;.container&lt;/span&gt;&lt;span&gt;!;&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;!&lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;.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;container&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;image&lt;/span&gt;&lt;span&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;images&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;sleep&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;infinity&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;enableInternet&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;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;await&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;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;}&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;Snapshots, SSH, and stdin streaming are supported, and the same code runs
under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;. Thanks
&lt;a href=&quot;https://github.com/danieljvdm&quot;&gt;Dan van der Merwe&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/containers&quot;&gt;Containers&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/cloudflare/compute/container-lifecycle&quot;&gt;Container lifecycle&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;k2-event-streams&quot;&gt;K2 event streams&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.K2.Stream&lt;/code&gt; is a durable event stream stored in R2
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2010&quot;&gt;#2010&lt;/a&gt;). A Worker
writes to it through a 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;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;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;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;K2&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;&quot;Orders&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; &lt;/span&gt;&lt;span&gt;&quot;7 days&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;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;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;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;K2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteStream&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;/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;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;send&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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&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;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;empty&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;202&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;K2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteStreamBinding&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;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;Long-running hosts consume the stream with &lt;code dir=&quot;auto&quot;&gt;consumeStreamRecords&lt;/code&gt;. Here a
Fly Service reviews large orders:&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;K2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeStreamRecords&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Orders&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ startAt&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;earliest&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; concurrency&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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;/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;map&lt;/span&gt;&lt;span&gt;((record) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;record&lt;/span&gt;&lt;span&gt;.value)&lt;/span&gt;&lt;span&gt;,&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;filter&lt;/span&gt;&lt;span&gt;((order) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;.amountCents &lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100_000&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&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;((order) &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;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`review ${&lt;/span&gt;&lt;span&gt;order&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;,&lt;/span&gt;&lt;/div&gt;&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;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;Workers can’t consume K2 streams yet. Cloudflare can’t push records to a
Worker, so produce from Workers and consume from a long-running host such as
a Fly, ECS, EC2, Railway, Hetzner, or Docker service. Alchemy will add a
Worker consumer once Cloudflare supports one.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/messaging/k2&quot;&gt;K2&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;basin&quot;&gt;Basin&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare renamed its data platform &lt;strong&gt;Basin&lt;/strong&gt;: Pipelines, the R2 Data
Catalog, and SQL. The same resources are now also exported as
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Basin.*&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2010&quot;&gt;#2010&lt;/a&gt;).
A pipeline reads a stream and writes to an Iceberg table with SQL:&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;lake&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;Lake&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;catalog&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;Basin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Catalog&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Catalog&quot;&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; lake })&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;views&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;Basin&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;&quot;PageViews&quot;&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;PageView&lt;/span&gt;&lt;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;table&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;Basin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Sink&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PageViewTable&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;basin_catalog&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;catalog&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; { namespace&lt;/span&gt;&lt;span&gt;:&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; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;page_views&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;token&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;CATALOG_TOKEN&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;Basin&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Pipeline&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;PageViewEtl&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;sql&lt;/span&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;interpolate&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;INSERT INTO ${&lt;/span&gt;&lt;span&gt;table&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;SELECT userId, path, at FROM ${&lt;/span&gt;&lt;span&gt;views&lt;/span&gt;&lt;span&gt;.name&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Alchemy checks the SQL with Cloudflare during plan, so a bad statement fails
before anything changes.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Basin.Table&lt;/code&gt; creates an Iceberg table directly, with columns from an Effect
Schema:&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;Cloudflare&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Basin&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;&quot;Orders&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;catalog&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;sales&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;schema&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;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;partitionBy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;day(at)&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/data/pipelines&quot;&gt;Pipelines&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/cloudflare/data/iceberg-tables&quot;&gt;Iceberg tables&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;workers-kv-instant&quot;&gt;Workers KV Instant&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.KV.InstantNamespace&lt;/code&gt; creates a namespace in Cloudflare’s new
Instant mode, for small configuration that is read often
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2027&quot;&gt;#2027&lt;/a&gt;). The existing
KV capabilities accept it, and &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; emulates 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;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;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;InstantNamespace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Config&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;// in a 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;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;ReadNamespace&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;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;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;feature-enabled&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;Switching a namespace between classic and Instant replaces it and does not
copy its data. Thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;BlankParticle&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;workers-issues&quot;&gt;Workers Issues&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Turn on Workers Issues error detection for a Worker
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1992&quot;&gt;#1992&lt;/a&gt;). Version
uploads and gradual rollouts keep the setting:&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;&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;observability&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { issues&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;vinext-10&quot;&gt;vinext 1.0&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Website.Vinext&lt;/code&gt; supports vinext 1.0, including hybrid App and Pages
Router builds (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2025&quot;&gt;#2025&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;BlankParticle&lt;/a&gt;!&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;private-databases-with-hyperdrive&quot;&gt;Private databases with Hyperdrive&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A Hyperdrive connection can now reach a database that has no public
endpoint, through a Workers VPC service
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2218&quot;&gt;#2218&lt;/a&gt;). Point the
origin at the service with &lt;code dir=&quot;auto&quot;&gt;serviceId&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;hyperdrive&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;Connection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hyperdrive&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;origin&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&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;serviceId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt;.serviceId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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; &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;user&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;password&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;password&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The guide connects a Worker to Aurora in private AWS subnets through a
Cloudflare Tunnel, and &lt;code dir=&quot;auto&quot;&gt;examples/cloudflare-hyperdrive-aws-vpc&lt;/code&gt; deploys
the whole thing.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/data/hyperdrive-private-database&quot;&gt;Private databases&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workers-cache-per-entrypoint&quot;&gt;Workers Cache per entrypoint&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;entrypoints&lt;/code&gt; sets Workers Cache for each entrypoint of a Worker
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2216&quot;&gt;#2216&lt;/a&gt;). An
entrypoint you don’t list uses the Worker’s &lt;code dir=&quot;auto&quot;&gt;cache&lt;/code&gt; setting:&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;&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;entrypoints&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; { 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;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;Public&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;,&lt;/span&gt;&lt;/div&gt;&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;durable-objects-deploy-with-exports&quot;&gt;Durable Objects deploy with exports&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Alchemy now uploads Durable Objects with Cloudflare’s declarative
&lt;code dir=&quot;auto&quot;&gt;exports&lt;/code&gt; instead of &lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2135&quot;&gt;#2135&lt;/a&gt;). Your code
doesn’t change. Alchemy can now deploy and adopt Workers that were last
deployed by Wrangler 4.107 or later.&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;This is a one-way change. Once a Worker deploys with &lt;code dir=&quot;auto&quot;&gt;exports&lt;/code&gt;, a release
before beta.82 can’t deploy it again. Pin &lt;code dir=&quot;auto&quot;&gt;alchemy@2.0.0-beta.82&lt;/code&gt; or later
everywhere the stack is deployed (laptops, CI, preview jobs) before the
first deploy, and don’t roll back past it.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The first deploy after upgrading must go out at 100% traffic. If you use
gradual deployments, remove &lt;code dir=&quot;auto&quot;&gt;version.traffic&lt;/code&gt; for that one deploy;
otherwise it fails with &lt;code dir=&quot;auto&quot;&gt;WorkerVersionConfigError&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Removing a Durable Object binding no longer deletes its namespace while
the class is still exported. Remove the class from your code to delete
it. Previews still use &lt;code dir=&quot;auto&quot;&gt;migrations&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects&quot;&gt;Durable Objects&lt;/a&gt; ·
&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;federated-apis&quot;&gt;Federated APIs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Serve one hostname from several Workers, each with only the permissions
it needs, using zone &lt;code dir=&quot;auto&quot;&gt;routes&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2088&quot;&gt;#2088&lt;/a&gt;). &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;
applies the same routing 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;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;Home&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/home.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;domain&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;/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;Worker&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Orders&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/orders.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;routes&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/orders*&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/networking/federated-apis&quot;&gt;Federated APIs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cloudflare-access-adopt-apps-and-saas&quot;&gt;Cloudflare Access: adopt apps and SaaS&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Access.Application&lt;/code&gt; can take over an existing app by its Cloudflare id
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1848&quot;&gt;#1848&lt;/a&gt;). The id and
&lt;code dir=&quot;auto&quot;&gt;aud&lt;/code&gt; stay the same, so JWT validation keeps working, and no &lt;code dir=&quot;auto&quot;&gt;--adopt&lt;/code&gt; is
needed:&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;grafana&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;Application&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Grafana&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;applicationId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;4f8e3c1a-5b2d-4e6f-9a7b-1c2d3e4f5a6b&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;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;grafana.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;If the id doesn’t exist, the deploy fails with &lt;code dir=&quot;auto&quot;&gt;DeclaredApplicationNotFound&lt;/code&gt;
instead of creating a new app.&lt;/p&gt;
&lt;p&gt;SAML and OIDC SaaS apps are supported too. The values Cloudflare generates,
such as the SSO endpoint and client id, come back as outputs:&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;looker&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;Application&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Looker&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;saas&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;saasApp&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;authType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;saml&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;spEntityId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.looker.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;consumerServiceUrl&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://example.looker.com/saml/acs&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;&lt;code dir=&quot;auto&quot;&gt;Access.Policy&lt;/code&gt; gains SSH and RDP connection rules, approval groups, and a
justification prompt:&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;Access&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Policy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;SshOps&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;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; &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;connectionRules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { ssh&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { usernames&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;root&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ubuntu&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;approvalGroups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ approvalsNeeded&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; emailAddresses&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;lead@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;purposeJustificationRequired&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;Updates no longer reset settings you leave out of the props. A field you
omit keeps its live value; pass &lt;code dir=&quot;auto&quot;&gt;[]&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt; to clear it. Thanks
&lt;a href=&quot;https://github.com/spinx&quot;&gt;spinx&lt;/a&gt; and
&lt;a href=&quot;https://github.com/Chinoman10&quot;&gt;Chinoman10&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/security/access&quot;&gt;Access&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;turso&quot;&gt;Turso&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Turso&lt;/strong&gt; provider creates groups and databases, with migrations,
and binds them to Workers and Lambdas
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2138&quot;&gt;#2138&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;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;Turso&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/Turso&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;Group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Turso&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;&quot;Group&quot;&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;aws-us-east-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;/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;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;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;group&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;Group&lt;/span&gt;&lt;span&gt;;&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;Turso&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;group&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;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;/div&gt;&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;Query it with Drizzle or &lt;code dir=&quot;auto&quot;&gt;SQL.LibSQL&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;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;Turso&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;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;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;LibSQL&lt;/span&gt;&lt;span&gt;(conn)&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;Turso.ManageDatabases&lt;/code&gt; creates a database per tenant at runtime:&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;tenants&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;Turso&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ManageDatabases&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Tenants&lt;/span&gt;&lt;span&gt;)&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;acme&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;tenants&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;&quot;acme&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;Docs: &lt;a href=&quot;https://alchemy.run/turso&quot;&gt;Turso&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/turso/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;aws-console-login&quot;&gt;AWS console login&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Authenticate an AWS profile with &lt;code dir=&quot;auto&quot;&gt;aws login&lt;/code&gt; (AWS CLI 2.32+), with no
long-lived keys
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1759&quot;&gt;#1759&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;alchemy profile refresh&lt;/code&gt; signs in again when the session expires:&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;aws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;login&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;my-console&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;--add&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;--method&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;console-login&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;loginProfile=my-console&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Thanks &lt;a href=&quot;https://github.com/jperezrealini&quot;&gt;jperezrealini&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/setup&quot;&gt;AWS setup&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dsql-migrations&quot;&gt;DSQL migrations&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.DSQL.Cluster&lt;/code&gt; applies SQL migrations when it deploys
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1544&quot;&gt;#1544&lt;/a&gt;). Each
statement runs in its own transaction, and &lt;code dir=&quot;auto&quot;&gt;CREATE INDEX&lt;/code&gt; becomes
&lt;code dir=&quot;auto&quot;&gt;CREATE INDEX ASYNC&lt;/code&gt;. SQL that DSQL can’t run is rejected before the
cluster is touched:&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;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;AWS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DSQL&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;Database&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;/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;Thanks &lt;a href=&quot;https://github.com/carlulsoe&quot;&gt;carlulsoe&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/aws/data/drizzle-dsql&quot;&gt;Drizzle on DSQL&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;neon-roles&quot;&gt;Neon roles&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Neon.Role&lt;/code&gt; creates a Postgres role on a branch, with a stable password
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2078&quot;&gt;#2078&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;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;Neon&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;&quot;App&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { branch })&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;owner&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;Neon&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;&quot;Owner&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { branch&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;app_owner&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; noLogin&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;Every Neon role has owner-level access to the branch’s databases.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/neon/data/roles&quot;&gt;Roles&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kubernetes-secrets-and-drift&quot;&gt;Kubernetes secrets and drift&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Redacted&lt;/code&gt; values in a &lt;code dir=&quot;auto&quot;&gt;Kubernetes.Manifest&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;Kubernetes.HelmChart&lt;/code&gt;
now reach the cluster as the real secret
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1948&quot;&gt;#1948&lt;/a&gt;). Before, the
cluster stored the placeholder &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;redacted&gt;&lt;/code&gt;. Plans and state still keep
the value wrapped:&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;Kubernetes&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;Token&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;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;Secret&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;token&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;stringData&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;Redacted&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt;(token) }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Kubernetes&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;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;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;./chart&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;values&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { apiKey&lt;/span&gt;&lt;span&gt;:&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;make&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;API errors and Helm output are scrubbed of those secrets, including their
base64 and JSON-escaped forms. Destroy fails when the cluster refuses a
delete (403 or 5xx) instead of reporting success, and calls to an
unreachable API server time out. &lt;code dir=&quot;auto&quot;&gt;alchemy drift&lt;/code&gt; now reports in-cluster
edits to the fields you declared, such as an image or replica count.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Kubernetes.Deployment&lt;/code&gt; also takes the cluster resource directly, so its
props can be a plain object
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2005&quot;&gt;#2005&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;Kubernetes&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;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; { 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; cluster&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;Gke&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;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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; cluster&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Gke&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;impl&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Neon.Function&lt;/code&gt; takes &lt;code dir=&quot;auto&quot;&gt;branch&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;project&lt;/code&gt; the same way.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/kubernetes&quot;&gt;Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;93-bug-fixes&quot;&gt;93 bug fixes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This release merges 93 fixes: 29 for Cloudflare and its local runtime, 23 for
AWS, 8 for Docker, and the rest across PlanetScale, the CLI, Prisma, GCP,
frontend frameworks, Neon, floci, and more.&lt;/p&gt;
&lt;p&gt;One of them,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2174&quot;&gt;#2174&lt;/a&gt;, fixes the resource
leaks, slow deletes, and flaky tests that kept the live AWS, Cloudflare, and
GCP suites from passing with clean accounts. For example, deleting a Lambda
function no longer waits about 40 seconds for its log group, interrupted
creates on CloudFront and Vertex AI are cleaned up instead of leaked, and
a replaced ACM PCA certificate authority no longer keeps its old policy.&lt;/p&gt;
&lt;p&gt;The full list is in the
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta82&quot;&gt;CHANGELOG&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;&lt;code dir=&quot;auto&quot;&gt;QueueSink&lt;/code&gt;&lt;/strong&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1781&quot;&gt;#1781&lt;/a&gt;)
drains an Effect &lt;code dir=&quot;auto&quot;&gt;Stream&lt;/code&gt; into a Queue, in batches Cloudflare accepts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bind a Worker’s own entrypoints&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2115&quot;&gt;#2115&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2161&quot;&gt;#2161&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.WorkerEntrypoint&amp;#x3C;Api&gt;(&quot;Api&quot;)&lt;/code&gt; without a Worker targets the
Worker that declares it, and Effect Workers call themselves through
&lt;code dir=&quot;auto&quot;&gt;ctx.exports&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R2 bucket locks&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1984&quot;&gt;#1984&lt;/a&gt;) with
&lt;code dir=&quot;auto&quot;&gt;locks&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;R2.Bucket&lt;/code&gt;, and &lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;R2.S3Credentials&lt;/code&gt; tokens are scoped to
their bucket&lt;/strong&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1985&quot;&gt;#1985&lt;/a&gt;)
instead of every bucket in the account. Thanks
&lt;a href=&quot;https://github.com/0x0f0f0f&quot;&gt;0x0f0f0f&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI crawler policies&lt;/strong&gt; on &lt;code dir=&quot;auto&quot;&gt;BotManagement&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1911&quot;&gt;#1911&lt;/a&gt;),
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Ssl.CertificateTransparencyAlerting&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1913&quot;&gt;#1913&lt;/a&gt;), and email
sending events on Queues
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1914&quot;&gt;#1914&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/birbprophet&quot;&gt;birbprophet&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;MtlsCertificate.Fetch&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2051&quot;&gt;#2051&lt;/a&gt;) calls an
origin with a client certificate from an Effect Worker. Thanks
&lt;a href=&quot;https://github.com/TBIQ007&quot;&gt;TBIQ007&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable Object namespaces&lt;/strong&gt; support &lt;code dir=&quot;auto&quot;&gt;jurisdiction&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2007&quot;&gt;#2007&lt;/a&gt;) and &lt;code dir=&quot;auto&quot;&gt;get&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;idFromName&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;idFromString&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;newUniqueId&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/852&quot;&gt;#852&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/Makisuo&quot;&gt;Makisuo&lt;/a&gt; and
&lt;a href=&quot;https://github.com/Butch78&quot;&gt;Butch78&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workers AI&lt;/strong&gt; reports billed neurons on finish parts
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1724&quot;&gt;#1724&lt;/a&gt;), and
streamed text, tool calls, and reasoning are fixed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2064&quot;&gt;#2064&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamoDB HTTP bindings from Cloudflare Workers&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1782&quot;&gt;#1782&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;logging.retention&lt;/code&gt;&lt;/strong&gt; on Lambda Functions and ECS Tasks
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2042&quot;&gt;#2042&lt;/a&gt;) and an
opt-in &lt;code dir=&quot;auto&quot;&gt;recoveryWindowInDays&lt;/code&gt; on Secrets Manager secrets
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2053&quot;&gt;#2053&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/TBIQ007&quot;&gt;TBIQ007&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda timeouts are traced&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1494&quot;&gt;#1494&lt;/a&gt;) — the root
span ends and telemetry flushes &lt;code dir=&quot;auto&quot;&gt;timeoutMargin&lt;/code&gt; before the timeout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.providers()&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;AWS.state()&lt;/code&gt; use a provided &lt;code dir=&quot;auto&quot;&gt;AWSEnvironment&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1933&quot;&gt;#1933&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/bjornpagen&quot;&gt;Bjorn Pagen&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GCP&lt;/strong&gt;: IAM service accounts, project services, and private GKE
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1995&quot;&gt;#1995&lt;/a&gt;), BigQuery
views and external tables
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2082&quot;&gt;#2082&lt;/a&gt;), and
in-place &lt;code dir=&quot;auto&quot;&gt;databaseVersion&lt;/code&gt; upgrades on Cloud SQL
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2029&quot;&gt;#2029&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/connyay&quot;&gt;connyay&lt;/a&gt; and
&lt;a href=&quot;https://github.com/bartek671&quot;&gt;bartek671&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PlanetScale &lt;code dir=&quot;auto&quot;&gt;deletionProtection&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1861&quot;&gt;#1861&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/agcty&quot;&gt;agcty&lt;/a&gt;! — and an edited migration that
already ran now replaces a dev branch or fails on production
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1489&quot;&gt;#1489&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; runtime options (&lt;code dir=&quot;auto&quot;&gt;networkMode&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;capAdd&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;devices&lt;/code&gt;) and
ordered &lt;code dir=&quot;auto&quot;&gt;envFiles&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1946&quot;&gt;#1946&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1947&quot;&gt;#1947&lt;/a&gt;), Podman
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2095&quot;&gt;#2095&lt;/a&gt;), and
authenticated image builds
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1858&quot;&gt;#1858&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/bjorntechTobbe&quot;&gt;bjorntechTobbe&lt;/a&gt;,
&lt;a href=&quot;https://github.com/armancharan&quot;&gt;armancharan&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/EthanShoeDev&quot;&gt;EthanShoeDev&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Railway.Service&lt;/code&gt; delete&lt;/strong&gt; only removes its own environment’s
instance (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2184&quot;&gt;#2184&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SvelteKit 3.0&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2060&quot;&gt;#2060&lt;/a&gt;) and a faster
CLI with a simpler launcher
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2151&quot;&gt;#2151&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;BlankParticle&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; on AWS&lt;/strong&gt; no longer hangs when Docker can’t publish an
emulator port
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2215&quot;&gt;#2215&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/2217&quot;&gt;#2217&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/containers&quot;&gt;Containers&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/compute/container-lifecycle&quot;&gt;Container lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/messaging/k2&quot;&gt;K2&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/data/pipelines&quot;&gt;Pipelines&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/data/iceberg-tables&quot;&gt;Iceberg tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/data/hyperdrive-private-database&quot;&gt;Hyperdrive private databases&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/networking/federated-apis&quot;&gt;Federated APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects&quot;&gt;Durable Objects&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/compute/workers&quot;&gt;Workers&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/security/access&quot;&gt;Access&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/kubernetes&quot;&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/turso&quot;&gt;Turso&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/setup&quot;&gt;AWS setup&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/data/drizzle-dsql&quot;&gt;Drizzle on DSQL&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/neon/data/roles&quot;&gt;Neon roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta83&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.81...v2.0.0-beta.83&quot;&gt;Compare v2.0.0-beta.81 → v2.0.0-beta.83&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>2.0.0-beta.80 - GCP, Neon &amp; Secret Providers</title><link>https://alchemy.run/blog/2026-09-29-beta-80/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-09-29-beta-80/</guid><description>v2.0.0-beta.80 adds a Google Cloud provider — ~1,050 resources across ~190 services, Effect-native Cloud Run and Cloud Functions runtimes, least-privilege IAM bindings, and event sources — turns Neon into a full backend provider with Functions, storage, Auth, and 13 website frameworks, and lets a stack load its secrets from dotenv, Doppler, or Infisical, with OIDC in CI. Also Effect 4.0 stable, Effect-native Prisma ORM v8, Fly Services with typed service-to-service calls and blue/green deploys, --include/--exclude deploys, durable callbacks, hibernating WebSocket RPC, and presigned R2 URLs in alchemy dev.</description><pubDate>Tue, 29 Sep 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;beta.80 has three headline additions. &lt;strong&gt;Google Cloud&lt;/strong&gt; arrives with
about 1,050 resources across 190 services, Effect-native runtimes on
Cloud Run, Cloud Functions, and GKE, and bindings that grant each host
the narrowest IAM role GCP allows. &lt;strong&gt;Neon&lt;/strong&gt; becomes a full backend
provider: Functions, object storage, managed Auth, the Data API, AI
Gateway, and 13 &lt;code dir=&quot;auto&quot;&gt;Neon.Website&lt;/code&gt; frameworks, all in one stack. &lt;strong&gt;Secret
providers&lt;/strong&gt; let a stack load its &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; from dotenv files,
&lt;strong&gt;Doppler&lt;/strong&gt;, or &lt;strong&gt;Infisical&lt;/strong&gt;, per stage, with browser login on your
machine and OIDC in CI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Effect 4.0 stable&lt;/strong&gt; is now the baseline. &lt;strong&gt;Prisma ORM v8&lt;/strong&gt; also lands with an Effect-native Postgres runtime. A
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt;&lt;/strong&gt; is now its own App with a public URL, typed calls to
other Services, blue/green deploys, and multi-container Machines, and
&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;--include&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;--exclude&lt;/code&gt;&lt;/strong&gt; deploy a slice of a stack. On Cloudflare:
durable callbacks, hibernating WebSocket RPC, presigned R2 URLs under
&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;, and Queue subscriptions from any resource.&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 4.0 stable is the new baseline&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1894&quot;&gt;#1894&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1899&quot;&gt;#1899&lt;/a&gt;). Upgrade
&lt;code dir=&quot;auto&quot;&gt;effect&lt;/code&gt; and the Effect platform packages together:&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;https://pkg.alchemy.run/alchemy/bea0366&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;effect@^4.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-bun@^4.0.0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@effect/platform-node@^4.0.0&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;Better Auth 1.7.5+&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1732&quot;&gt;#1732&lt;/a&gt;). Drizzle
users install &lt;code dir=&quot;auto&quot;&gt;@better-auth/drizzle-adapter&lt;/code&gt;, adopt Relations v2, and
regenerate the auth schema. Custom secondary storage must implement
&lt;code dir=&quot;auto&quot;&gt;increment(key, ttlSeconds)&lt;/code&gt; with a required TTL, and &lt;code dir=&quot;auto&quot;&gt;increment&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;getAndDelete&lt;/code&gt; must be atomic. See
&lt;a href=&quot;https://alchemy.run/better-auth/upgrades/from-1-6-to-1-7&quot;&gt;Upgrading from 1.6 to 1.7&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;Cloudflare.AI.Model&lt;/code&gt; is now the Workers AI catalog resource&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1722&quot;&gt;#1722&lt;/a&gt;). The AI
Search model-name type that used this name is now &lt;code dir=&quot;auto&quot;&gt;AI.SearchModel&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript Workers default to &lt;code dir=&quot;auto&quot;&gt;new_module_registry&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1663&quot;&gt;#1663&lt;/a&gt;) in
deploys, &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;, and Vite preview. Opt out with
&lt;code dir=&quot;auto&quot;&gt;compatibility: { flags: [&quot;legacy_module_registry&quot;] }&lt;/code&gt;. Python Workers
are unchanged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;Fly.Machine&lt;/code&gt; has no &lt;code dir=&quot;auto&quot;&gt;url&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1794&quot;&gt;#1794&lt;/a&gt;). Use a
&lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt; when you need an endpoint.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Durable Object transactions are stricter&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1668&quot;&gt;#1668&lt;/a&gt;). Storage
access from a sibling fiber inside &lt;code dir=&quot;auto&quot;&gt;storage.transaction&lt;/code&gt;, and writes
after &lt;code dir=&quot;auto&quot;&gt;txn.rollback()&lt;/code&gt;, now fail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;@distilled.cloud/hetzner&lt;/code&gt; exports services from the package root&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1784&quot;&gt;#1784&lt;/a&gt;). Only
affects code that calls the SDK directly:&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;Services&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;@distilled.cloud/hetzner&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;Services&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;servers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getServer&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;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;Hetzner&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;@distilled.cloud/hetzner&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;Hetzner&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;servers&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getServer&lt;/span&gt;&lt;span&gt;({ id })&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 latest distilled also renames Fly’s &lt;code dir=&quot;auto&quot;&gt;updateMachineMetadata&lt;/code&gt; to
&lt;code dir=&quot;auto&quot;&gt;patchMachineMetadata&lt;/code&gt; and PlanetScale’s &lt;code dir=&quot;auto&quot;&gt;createKeyspaceResizeRequest&lt;/code&gt;
to &lt;code dir=&quot;auto&quot;&gt;updateKeyspaceResizeRequest&lt;/code&gt;, and the Railway SDK moves to
&lt;code dir=&quot;auto&quot;&gt;Query.fn&lt;/code&gt; lenses
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1891&quot;&gt;#1891&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;google-cloud&quot;&gt;Google Cloud&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/GCP&lt;/code&gt; is a new provider
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1336&quot;&gt;#1336&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;! It covers about 1,050
resources across 190 services, with Effect-native runtimes on every GCP
compute host:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Effect runtime&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;GCP.Function&lt;/code&gt; (a Cloud Run Service)&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.Run.Job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;run&lt;/code&gt;, exits on completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.Run.WorkerPool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;run&lt;/code&gt;, long-lived&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.CloudFunctions.Function&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt; on Node 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;Kubernetes.Deployment&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;Job&lt;/code&gt; on GKE&lt;/td&gt;
&lt;td&gt;same as EKS, through Workload Identity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Bindings follow the same shape as AWS and Cloudflare. Each &lt;code dir=&quot;auto&quot;&gt;yield*&lt;/code&gt;
grants one role to the host’s runtime service account, scoped as tightly
as GCP allows, and the grant is revoked when the binding is removed.&lt;/p&gt;
&lt;p&gt;Here is an order service: a Cloud Run API that stores orders in
Firestore and publishes an event, and a second service that consumes
those events from Pub/Sub. Start with the database and the queue:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/resources.ts&lt;/span&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;GCP&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/GCP&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;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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Firestore&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;Orders&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;us-central1&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;FIRESTORE_NATIVE&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;OrderEvents&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Topic&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;OrderEvents&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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;websites-on-cloud-run&quot;&gt;Websites on Cloud Run&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;GCP.Website&lt;/code&gt; adds framework websites and &lt;code dir=&quot;auto&quot;&gt;StaticSite&lt;/code&gt; on Cloud Run
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1898&quot;&gt;#1898&lt;/a&gt;). Choose from
Next.js, Nuxt, Astro, SvelteKit, TanStack Start, React Router, SolidStart,
Waku, Vite, Vocs, Vinext, Foldkit, and Octane. The shared options cover
public access, ingress, scaling, and container resources.&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;GCP&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;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;rootDir&lt;/span&gt;&lt;span&gt;:&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;/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;a-database&quot;&gt;A database&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The API writes each order to Firestore and announces it on the topic:&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;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;GCP&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/GCP&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;Effect&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/Effect&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;HttpServerRequest&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/http/HttpServerRequest&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;HttpServerResponse&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/http/HttpServerResponse&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;OrderEvents&lt;/span&gt;&lt;span&gt;,&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./resources.ts&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;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;GCP&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; location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;us-central1&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; invokerIamDisabled&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;// datastore.user, under an IAM Condition naming only this database&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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Firestore&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteDatabase&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// pubsub.publisher on this topic 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;const&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; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteTopic&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;OrderEvents&lt;/span&gt;&lt;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;email&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;total&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; { email&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; total&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; number &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;&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;orderId&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crypto&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;randomUUID&lt;/span&gt;&lt;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;db&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;`orders/${&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; { &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;total&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;created&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;events&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;publish&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;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;orderId&lt;/span&gt;&lt;span&gt;,&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; &lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;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;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;orderId&lt;/span&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;202&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Firestore&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ReadWriteDatabaseHttp&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteTopicHttp&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;h3 id=&quot;a-queue-consumer&quot;&gt;A queue consumer&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Fulfillment service subscribes to the topic and marks each order
fulfilled. &lt;code dir=&quot;auto&quot;&gt;consumeTopicMessages&lt;/code&gt; creates the push subscription and the
route it delivers to:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/Fulfillment.ts&lt;/span&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;GCP&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/GCP&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;Effect&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/Effect&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;Stream&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/Stream&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;HttpServerResponse&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/http/HttpServerResponse&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;OrderEvents&lt;/span&gt;&lt;span&gt;,&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./resources.ts&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fulfillment&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;GCP&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;Fulfillment&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;Fulfillment&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; location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;us-central1&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;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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Firestore&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteDatabase&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;/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;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;PubSub&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;consumeTopicMessages&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;OrderEvents&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (messages) &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;messages&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;Stream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;runForEach&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;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;orderId&lt;/span&gt;&lt;span&gt; } &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;parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;Buffer&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;message&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;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;base64&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;utf8&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;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;db&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`orders/${&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; { status&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;fulfilled&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;// A failure answers the push with a 500, so Pub/Sub redelivers.&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;.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;;&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; { 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;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;GCP&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;TopicEventSource&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GCP&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Firestore&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WriteDatabaseHttp&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Fulfillment has no public URL. Pub/Sub signs each push with an OIDC
token for the service’s own account, which gets &lt;code dir=&quot;auto&quot;&gt;run.invoker&lt;/code&gt; on the
service, and every request’s token is verified before the handler runs.
Jobs and WorkerPools consume the same topic by pulling instead, with
&lt;code dir=&quot;auto&quot;&gt;GCP.Run.TopicPullEventSource&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Add both services to a stack:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;alchemy.run.ts&lt;/span&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;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;GCP&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/GCP&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;Effect&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/Effect&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;Api&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;./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;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Fulfillment&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;./src/Fulfillment.ts&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;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;Orders&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;GCP&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;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;localState&lt;/span&gt;&lt;span&gt;() }&lt;/span&gt;&lt;span&gt;,&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;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;Api&lt;/span&gt;&lt;span&gt;;&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;Fulfillment&lt;/span&gt;&lt;span&gt;;&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; { 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;.uri }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;Storage, Pub/Sub, Firestore, and BigQuery have &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; clients. &lt;code dir=&quot;auto&quot;&gt;GCP.SQL.Connect&lt;/code&gt; reaches Cloud SQL,
&lt;code dir=&quot;auto&quot;&gt;GCP.Run.InvokeService&lt;/code&gt; calls another private service with a
Google-signed ID token, and &lt;code dir=&quot;auto&quot;&gt;GCP.AIPlatform.GenerateContent&lt;/code&gt; calls
Gemini. Besides Pub/Sub, event sources cover Storage, Cloud Scheduler,
and Eventarc.&lt;/p&gt;
&lt;p&gt;The default region comes from your profile (else &lt;code dir=&quot;auto&quot;&gt;us-central1&lt;/code&gt;), and
&lt;code dir=&quot;auto&quot;&gt;GCP.Region(&quot;europe-west1&quot;)&lt;/code&gt; overrides it for a stack. Reconciles wait
until GCP reports a resource ready, deletes wait until it is gone, and
&lt;code dir=&quot;auto&quot;&gt;pnpm nuke:gcp&lt;/code&gt; clears a test project. Sixteen examples — including
&lt;code dir=&quot;auto&quot;&gt;gcp-pubsub-fanout&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;gcp-event-pipeline&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;gcp-cloud-sql-drizzle&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;gcp-vertex-ai&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;gcp-gke&lt;/code&gt; — each pass a live deploy-and-destroy
test.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/gcp&quot;&gt;GCP&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/setup&quot;&gt;Setup&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/gcp/security/iam&quot;&gt;Bindings&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/gcp/messaging/pubsub&quot;&gt;Event pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;neon-functions-storage-auth-and-websites&quot;&gt;Neon: Functions, storage, Auth, and websites&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/Neon&lt;/code&gt; grows from Projects and Branches into a full backend
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1695&quot;&gt;#1695&lt;/a&gt;). A
&lt;code dir=&quot;auto&quot;&gt;Neon.Function&lt;/code&gt; runs a native Fetch handler or an Effect program on
Node 24, and bindings wire in Postgres and object storage without
passing your deployment API key to the application:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/resources.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;Backend&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;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;Neon&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;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;aws-us-east-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;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;/div&gt;&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;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;Neon&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;Uploads&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; access&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;span&gt;;&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; { project&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; uploads }&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/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;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;Neon&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;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;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;Backend&lt;/span&gt;&lt;span&gt;;&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;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;.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;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;project&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Backend&lt;/span&gt;&lt;span&gt;;&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;Neon&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;project&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&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;.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;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;Neon&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;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;/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 now() AS time`&lt;/span&gt;&lt;span&gt;;&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;files&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;&quot;latest.json&quot;&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;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;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;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;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;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;Neon&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ConnectHttp&lt;/span&gt;&lt;span&gt;,&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;WriteBucketHttp&lt;/span&gt;&lt;span&gt;]))&lt;/span&gt;&lt;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;Thirteen frameworks deploy as Fetch Functions, with the same props as
on the other providers:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;alchemy.run.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;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;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;{ providers&lt;/span&gt;&lt;span&gt;:&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;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;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;localState&lt;/span&gt;&lt;span&gt;() }&lt;/span&gt;&lt;span&gt;,&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;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;Api&lt;/span&gt;&lt;span&gt;;&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;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;Prisma&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;const &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;Neon&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;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return { url&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;/div&gt;&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 in the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Bucket&lt;/code&gt;, typed &lt;code dir=&quot;auto&quot;&gt;Object&amp;#x3C;T&gt;&lt;/code&gt; seed values, &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; bucket and object bindings, and presigned GET/PUT URLs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth&lt;/strong&gt; — managed Better Auth with &lt;code dir=&quot;auto&quot;&gt;AuthOAuthProvider&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;AuthTrustedDomain&lt;/code&gt;, and a &lt;code dir=&quot;auto&quot;&gt;ConnectAuth&lt;/code&gt; binding for the Auth and JWKS URLs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data API&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;DataApi&lt;/code&gt; configures PostgREST; &lt;code dir=&quot;auto&quot;&gt;QueryDataApi&lt;/code&gt; forwards the caller’s JWT so row-level security applies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Gateway&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;QueryAIGateway&lt;/code&gt; plus &lt;code dir=&quot;auto&quot;&gt;makeLanguageModelLayer&lt;/code&gt; for Effect AI’s &lt;code dir=&quot;auto&quot;&gt;LanguageModel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;CronEventSource&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;BucketEventSource&lt;/code&gt; register a typed handler and its trigger in one call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operations&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;Credential&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;CustomDomain&lt;/code&gt;, and experimental organization governance: API keys, member roles, spending limits, and VPC endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; runs each website’s native framework server and a local
Fetch runtime for Functions; &lt;code dir=&quot;auto&quot;&gt;.pipe(Alchemy.remote())&lt;/code&gt; deploys one for
real.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/neon&quot;&gt;Neon&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/neon/tutorial&quot;&gt;Tutorial&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/neon/guides/preview-branches&quot;&gt;Preview branches&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/neon/guides/production-auth&quot;&gt;Production Auth&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;secret-providers-dotenv-doppler-and-infisical&quot;&gt;Secret providers: dotenv, Doppler, and Infisical&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A stack now chooses where its secrets come from
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1728&quot;&gt;#1728&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;! Every
&lt;code dir=&quot;auto&quot;&gt;Config.Redacted(&quot;DATABASE_URL&quot;)&lt;/code&gt; in your program — in the stack, in a
resource provider, or captured by a Worker or Lambda — resolves from the
list you give &lt;code dir=&quot;auto&quot;&gt;Alchemy.Stack&lt;/code&gt;’s new &lt;code dir=&quot;auto&quot;&gt;secrets&lt;/code&gt; option. Nothing is written
to &lt;code dir=&quot;auto&quot;&gt;process.env&lt;/code&gt; or to disk.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;alchemy.run.ts&lt;/span&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;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;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;Doppler&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/Doppler&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;Effect&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/Effect&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;Api&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;./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;/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;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;MyApp&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;providers&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;providers&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;Cloudflare&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;&lt;/span&gt;&lt;span&gt;secrets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;Doppler&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Secrets&lt;/span&gt;&lt;span&gt;(({ stage }) &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;project&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;my-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;config&lt;/span&gt;&lt;span&gt;:&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; &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;span&gt; &lt;/span&gt;&lt;span&gt;&quot;prd&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;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;span&gt;}))&lt;/span&gt;&lt;span&gt;,&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;Secrets&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DotEnv&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;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;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;Api&lt;/span&gt;&lt;span&gt;;&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; { 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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The Worker reads the secret the same way it always has:&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;databaseUrl&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;DATABASE_URL&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;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;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;databaseUrl&lt;/span&gt;&lt;span&gt;) })&lt;/span&gt;&lt;span&gt;;&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;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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;span&gt;`SELECT now() AS time`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;,&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;Rotating the value in Doppler and running &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt; now ships it:
a changed &lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; value read during a Worker’s Init plans an update
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1837&quot;&gt;#1837&lt;/a&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;precedence&quot;&gt;Precedence&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Later entries override earlier ones. A missing key falls through to the
next source, and an empty string counts as a value. The process
environment is always the implicit last entry, so a one-off
&lt;code dir=&quot;auto&quot;&gt;DATABASE_URL=… alchemy deploy&lt;/code&gt; or a CI runner’s exported variables
still win. List &lt;code dir=&quot;auto&quot;&gt;Alchemy.Secrets.ProcessEnv()&lt;/code&gt; yourself to rank it
elsewhere, or pass &lt;code dir=&quot;auto&quot;&gt;{ disabled: true }&lt;/code&gt; to leave the shell out.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;per-stage&quot;&gt;Per stage&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;secrets&lt;/code&gt; and every provider’s options also accept a callback that
receives the stage, so one stack serves &lt;code dir=&quot;auto&quot;&gt;dev&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;pr-42&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;prod&lt;/code&gt; from
different places:&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;secrets&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ({ stage }) &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;stage &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;/div&gt;&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;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Secrets&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DotEnv&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;.env&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;.env.local&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;Infisical&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Secrets&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;&quot;my-app&quot;&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; stage&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;/api&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;h3 id=&quot;logging-in-locally-and-in-ci&quot;&gt;Logging in, locally and in CI&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;On your machine, &lt;code dir=&quot;auto&quot;&gt;alchemy profile edit --add Doppler&lt;/code&gt; opens a browser
login, and &lt;code dir=&quot;auto&quot;&gt;alchemy profile edit --add Infisical&lt;/code&gt; stores a Universal
Auth machine identity or a user token. In CI, set &lt;code dir=&quot;auto&quot;&gt;DOPPLER_TOKEN&lt;/code&gt; /
&lt;code dir=&quot;auto&quot;&gt;INFISICAL_TOKEN&lt;/code&gt;, or skip long-lived tokens entirely with OIDC: set
&lt;code dir=&quot;auto&quot;&gt;DOPPLER_IDENTITY_ID&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;INFISICAL_IDENTITY_ID&lt;/code&gt;, and Alchemy exchanges
the platform’s identity token on GitHub Actions, GitLab CI, Vercel, or
Google Cloud for a short-lived one on every run:&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;jobs&lt;/span&gt;&lt;span&gt;:&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&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;permissions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;id-token&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;contents&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;steps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&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;run&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bun alchemy deploy --stage prod --yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;DOPPLER_IDENTITY_ID&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${{ vars.DOPPLER_IDENTITY_ID }}&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;--log-level debug&lt;/code&gt; prints which variable names each source loaded,
never their values. Any Effect Layer that provides a &lt;code dir=&quot;auto&quot;&gt;ConfigProvider&lt;/code&gt;
works as a custom entry.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/environments/secret-providers&quot;&gt;Secret providers&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/environments/doppler&quot;&gt;Doppler&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/infisical&quot;&gt;Infisical&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;prisma-orm-v8&quot;&gt;Prisma ORM v8&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Prisma ORM v8 runs on an Effect-native Postgres runtime
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1198&quot;&gt;#1198&lt;/a&gt;). Queries,
prepared statements, streams, and transactions are Effects with typed
errors and per-execution connection cleanup. Write the contract in
TypeScript or in Prisma Schema Language (PSL); both use the same
runtime. Prisma stays an optional peer.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;typescript-first&quot;&gt;TypeScript-first&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Define the contract with Prisma’s own builders:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/prisma/contract.ts&lt;/span&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;defineContract&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/Prisma/ORM&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;contract&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineContract&lt;/span&gt;&lt;span&gt;({}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; ({ field&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; rel }) &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;models&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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;model&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; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&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;field&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;uuidv7Native&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;field&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;unique&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;field&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;,&lt;/span&gt;&lt;/div&gt;&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;relations&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;rel&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;hasMany&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Post&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { by&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;authorId&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;Post&lt;/span&gt;&lt;span&gt;:&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;&quot;Post&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;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&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;field&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;uuidv7Native&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;field&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;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;authorId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;uuidNative&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;relations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { author&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;belongsTo&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; { from&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;authorId&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; to&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;id&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;Pass it straight to &lt;code dir=&quot;auto&quot;&gt;Postgres&lt;/code&gt; — no generated code:&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;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;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;PrismaPostgres&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/Prisma/ORM/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;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;Effect&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/Effect&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;HttpServerResponse&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/http/HttpServerResponse&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;Hyperdrive&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;./db.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;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;contract&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;./prisma/contract.ts&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;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;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;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;    &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;PrismaPostgres&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; { &lt;/span&gt;&lt;span&gt;contract&lt;/span&gt;&lt;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;orm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;public&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;include&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;posts&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&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;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;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;Hyperdrive&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;psl-first&quot;&gt;PSL-first&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Keep &lt;code dir=&quot;auto&quot;&gt;contract.psl&lt;/code&gt; authoritative:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/prisma/contract.psl&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&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    id.uuidv7Native()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;email &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@unique&lt;/span&gt;&lt;/div&gt;&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;String&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;posts Post&lt;/span&gt;&lt;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;model&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Post&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&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       id.uuidv7Native()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title    &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;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;authorId Uuid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author   User &lt;/span&gt;&lt;span&gt;@relation&lt;/span&gt;&lt;span&gt;(fields: [&lt;/span&gt;&lt;span&gt;authorId&lt;/span&gt;&lt;span&gt;], references: [&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;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Register Alchemy’s Effect generator in &lt;code dir=&quot;auto&quot;&gt;prisma.config.ts&lt;/code&gt;, then run
&lt;code dir=&quot;auto&quot;&gt;alchemy prisma generate&lt;/code&gt; (or &lt;code dir=&quot;auto&quot;&gt;--watch&lt;/code&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;prisma.config.ts&lt;/span&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;defineConfig&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;ormConfig&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;@prisma/orm-postgres/config&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;definePrismaConfig&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;prisma/config&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;withEffect&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/Prisma/ORM/generator&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;definePrismaConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;orm&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;withEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ormConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;contract&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/prisma/contract.psl&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;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;./src/prisma/generated&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;{ client&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; schemas&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;The Worker imports the generated &lt;code dir=&quot;auto&quot;&gt;makeDatabase&lt;/code&gt; instead of the
contract; queries are identical:&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;PrismaPostgres&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/Prisma/ORM/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;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;contract&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;./prisma/contract.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;import&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;makeDatabase&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;./prisma/generated/client.ts&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;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;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;    &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;PrismaPostgres&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; { contract })&lt;/span&gt;&lt;span&gt;;&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;makeDatabase&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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Both forms can also produce standalone Effect Schemas for rows —
&lt;code dir=&quot;auto&quot;&gt;makeSchemas(contract)&lt;/code&gt; or the generated &lt;code dir=&quot;auto&quot;&gt;schemas.ts&lt;/code&gt;. The
&lt;code dir=&quot;auto&quot;&gt;cloudflare-neon-prisma&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;cloudflare-neon-prisma-psl&lt;/code&gt; examples run
each form end to end on Neon through Hyperdrive, with migrations
applied on deploy by &lt;code dir=&quot;auto&quot;&gt;Prisma.Contract&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Prisma.Migrate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/sql/prisma/contracts&quot;&gt;Contracts&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/sql/prisma/postgres&quot;&gt;Postgres&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/sql/prisma/migrations&quot;&gt;Migrations&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;fly-a-service-owns-its-app&quot;&gt;Fly: a Service owns its App&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A &lt;code dir=&quot;auto&quot;&gt;Fly.Service&lt;/code&gt; is now its own Fly App with its own public URL
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1794&quot;&gt;#1794&lt;/a&gt;). You no
longer declare an App and an IP address 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;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;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;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;PublicIp&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;IpAssignment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Shared&quot;&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; type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;shared_v4&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;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;/div&gt;&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;&lt;code dir=&quot;auto&quot;&gt;public: false&lt;/code&gt; keeps a Service off the internet. A Service can return
methods beside &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;, and another Service binds it with
&lt;code dir=&quot;auto&quot;&gt;Fly.bindService&lt;/code&gt; for a typed client:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/users.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;Users&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;Users&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;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;{ 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; public&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;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;list&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;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;/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;// src/gateway.ts&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;class&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;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;Gateway&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;Gateway&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;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;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;bindService&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;/div&gt;&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;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;yield*&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;list&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;,&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;Calls are plain HTTP over Flycast. Each one carries the caller’s token
and Fly’s signed &lt;code dir=&quot;auto&quot;&gt;Fly-Src&lt;/code&gt; header, so only Services that bind &lt;code dir=&quot;auto&quot;&gt;Users&lt;/code&gt;
can call it. &lt;code dir=&quot;auto&quot;&gt;network: yield* Fly.stackNetwork&lt;/code&gt; isolates Services on a
private network per stack and stage, and &lt;code dir=&quot;auto&quot;&gt;region: [&quot;iad&quot;, &quot;lhr&quot;]&lt;/code&gt; runs
&lt;code dir=&quot;auto&quot;&gt;count&lt;/code&gt; Machines in each region behind one hostname.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;bluegreen-deploys&quot;&gt;Blue/green deploys&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Add &lt;code dir=&quot;auto&quot;&gt;deploy: { strategy: &quot;bluegreen&quot; }&lt;/code&gt; and the next &lt;code dir=&quot;auto&quot;&gt;alchemy deploy&lt;/code&gt;
starts a checked replacement before stopping the running version
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1706&quot;&gt;#1706&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;shutdown&lt;/code&gt; gives in-flight responses time to finish:&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;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;{&lt;/span&gt;&lt;/div&gt;&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;deploy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { strategy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bluegreen&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;shutdown&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;60 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;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Websites take the same two props. An interrupted rollout resumes on the
next deploy, and a failed readiness check leaves the old version
serving. Rolling updates stay the default and remain the only option for
volume-backed Services.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;multi-container-machines&quot;&gt;Multi-container Machines&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Run an API and its sidecar in one Machine with Fly’s native container
groups, rolling or blue/green
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1768&quot;&gt;#1768&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1769&quot;&gt;#1769&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/Floriferous&quot;&gt;Florian Bienefelt&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;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;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;Preview&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;const&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;=&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;Machine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Preview&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;app&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;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;containers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&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;name&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;/div&gt;&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;span&gt;healthChecks&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; { 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; path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;/health&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;/div&gt;&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;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;image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;ghcr.io/acme/worker: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;dependsOn&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;api&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; condition&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;healthy&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;Florian also added Flycast &lt;code dir=&quot;auto&quot;&gt;private_v6&lt;/code&gt; addresses to
&lt;code dir=&quot;auto&quot;&gt;Fly.IpAssignment&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1749&quot;&gt;#1749&lt;/a&gt;) and made
rolling updates wait for service checks before touching the next
replica (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1670&quot;&gt;#1670&lt;/a&gt;).
Fly bindings now carry their values through the runtime context
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1554&quot;&gt;#1554&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/Mkassabov&quot;&gt;Michael K&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/fly/compute/services&quot;&gt;Services&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/fly/compute/connecting-services&quot;&gt;Connecting Services&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/fly/compute/deployments&quot;&gt;Deployments&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/fly/networking&quot;&gt;Networking&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;deploy-part-of-a-stack&quot;&gt;Deploy part of a stack&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;--include&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;--exclude&lt;/code&gt; reconcile a subset of resources and Actions
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1757&quot;&gt;#1757&lt;/a&gt;). Each flag
takes an FQN, a logical ID, or a glob, and can repeat:&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;deploy&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;pr-123&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;&apos;Database/**&apos;&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;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--exclude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;Services/Background/**&apos;&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;plan&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;&apos;Database/Branch&apos;&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;&apos;Database/Password&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dependencies of included resources come along automatically; excluding
one fails the plan with its dependency chain. Excluded state is left
untouched. &lt;code dir=&quot;auto&quot;&gt;Test.make&lt;/code&gt;’s &lt;code dir=&quot;auto&quot;&gt;deploy&lt;/code&gt; takes the same filters:&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;test&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&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;make&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;Cloudflare&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;/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;test&lt;/span&gt;&lt;span&gt;(&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;migrates the database&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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&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; { include&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;Database/**&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;div&gt;&lt;h2 id=&quot;durable-callbacks&quot;&gt;Durable callbacks&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Alchemy.makeCallback&lt;/code&gt; schedules typed work that survives the request
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1668&quot;&gt;#1668&lt;/a&gt;). Durable
Objects are the first host: jobs live in SQLite and fire from native
alarms, and scheduling joins the storage transaction, so the write and
the job commit together:&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;Document&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;Document&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;Document&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;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;onSnapshot&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;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;makeCallback&lt;/span&gt;&lt;span&gt;(&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;snapshot&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;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; (payload&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;revision&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;) {&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;`revisions:${&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;.revision&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;payload&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;/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;save&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;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; (revision&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;/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;transaction&lt;/span&gt;&lt;span&gt;(&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;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;&quot;document&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;revision&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;/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;onSnapshot&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;revision&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;after&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;30 seconds&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;payload&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;revision&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;/div&gt;&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;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;Delivery is at least once with retries. Existing &lt;code dir=&quot;auto&quot;&gt;scheduleEvent&lt;/code&gt; jobs
keep running beside callbacks on the object’s single alarm. Alarm
updates are now batched once per transaction
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1701&quot;&gt;#1701&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects#register-a-durable-callback&quot;&gt;Durable Objects → Register a durable callback&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;hibernating-websocket-rpc&quot;&gt;Hibernating WebSocket RPC&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;An &lt;code dir=&quot;auto&quot;&gt;RpcDurableObject&lt;/code&gt; that returns its handler Layer now serves Effect
RPC over hibernating WebSockets as well as HTTP
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1705&quot;&gt;#1705&lt;/a&gt;). The
request picks the transport; your code doesn’t change.&lt;/p&gt;
&lt;p&gt;Define the RPCs once and share them between server and client:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;rpcs.ts&lt;/span&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;Schema&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/Schema&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;Rpc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RpcGroup&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/rpc&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CounterRpcs&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;RpcGroup&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;Rpc&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;increment&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; {}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; success&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;Number&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;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;Implement them in an &lt;code dir=&quot;auto&quot;&gt;RpcDurableObject&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;counter.ts&lt;/span&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;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;Effect&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/Effect&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;CounterRpcs&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;./rpcs.ts&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;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;RpcDurableObject&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;span&gt;{ schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CounterRpcs&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&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;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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CounterRpcs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toLayer&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;transaction&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&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;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;map&lt;/span&gt;&lt;span&gt;((n) &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;n&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;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;Effect&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tap&lt;/span&gt;&lt;span&gt;((n) &lt;/span&gt;&lt;span&gt;=&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;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;&quot;count&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;.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;;&lt;/span&gt;&lt;/div&gt;&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 Worker picks an object by name and forwards the connection to it:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;worker.ts&lt;/span&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;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;Effect&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/Effect&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;HttpServerRequest&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/http/HttpServerRequest&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;HttpServerResponse&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/http/HttpServerResponse&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;Counter&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;./counter.ts&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CounterWorker&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;CounterWorker&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;CounterWorker&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;counters&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;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;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;path&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;https://worker&quot;&lt;/span&gt;&lt;span&gt;).pathname&lt;/span&gt;&lt;span&gt;;&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;name&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;counters&lt;/span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;([\w-]&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;exec&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;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;if&lt;/span&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;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;empty&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;404&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&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;counters&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;name&lt;/span&gt;&lt;span&gt;,&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;/div&gt;&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;In the browser, &lt;code dir=&quot;auto&quot;&gt;alchemy/Cloudflare/RpcWebSocketClient&lt;/code&gt; builds a typed
client over one WebSocket. It imports only Effect modules, so it is safe
to bundle:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;client.ts&lt;/span&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;RpcWebSocketClient&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/RpcWebSocketClient&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;Context&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/Context&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;Effect&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/Effect&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;Layer&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/Layer&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;RpcClient&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/rpc/RpcClient&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;type&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;RpcClientError&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/rpc/RpcClientError&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;Socket&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/socket/Socket&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;CounterRpcs&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;./rpcs.ts&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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CounterClient&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CounterClient&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;RpcClient&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;FromGroup&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;CounterRpcs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RpcClientError&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;&gt;&lt;/span&gt;&lt;span&gt;()(&lt;/span&gt;&lt;span&gt;&quot;CounterClient&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;CounterClientLive&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RpcWebSocketClient&lt;/span&gt;&lt;span&gt;.&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;&lt;/span&gt;&lt;span&gt;CounterClient&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CounterRpcs&lt;/span&gt;&lt;span&gt;,&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;wss://example.com/counters/alice&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;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;Socket&lt;/span&gt;&lt;span&gt;.layerWebSocketConstructorGlobal))&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;program&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;counter&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;CounterClient&lt;/span&gt;&lt;span&gt;;&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;counter&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;/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;CounterClientLive&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;Every call on that socket goes to the &lt;code dir=&quot;auto&quot;&gt;&quot;alice&quot;&lt;/code&gt; object. While the
connection is idle the Durable Object can hibernate; the next call wakes
it and is answered on the same socket. Alchemy handles the heartbeats and
restores the connection after a wake. In-flight calls are not replayed:
if the object restarts mid-call, the socket closes with code &lt;code dir=&quot;auto&quot;&gt;1012&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/apis/effect-rpc#http-and-websocket-rpc&quot;&gt;Effect RPC → HTTP and WebSocket RPC&lt;/a&gt;
· &lt;a href=&quot;https://alchemy.run/cloudflare/apis/effect-rpc#forward-browser-connections&quot;&gt;Forward browser connections&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;typed-websocket-attachments&quot;&gt;Typed WebSocket attachments&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;If you write your own WebSocket handlers on a plain &lt;code dir=&quot;auto&quot;&gt;DurableObject&lt;/code&gt;
instead of using RPC, you can now validate the data you attach to each
socket with an Effect Schema
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1723&quot;&gt;#1723&lt;/a&gt;). A session
read back after hibernation comes back decoded and typed, where
&lt;code dir=&quot;auto&quot;&gt;deserializeAttachment&lt;/code&gt; used to return an unchecked value:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;room.ts&lt;/span&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;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;Effect&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/Effect&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;Schema&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/Schema&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;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;Schema&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Struct&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&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;Schema&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;&lt;/span&gt;&lt;span&gt;joinedAt&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;DateFromString&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Room&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;Room&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;Rooms&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;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;&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;socket&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;upgrade&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&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;joinedAt&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;Effect&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;=&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;Date&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;;&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;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setAttachment&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; { id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crypto&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;randomUUID&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;joinedAt&lt;/span&gt;&lt;span&gt; })&lt;/span&gt;&lt;span&gt;;&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;response&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;webSocketMessage&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;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function*&lt;/span&gt;&lt;span&gt; (socket&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;WebSocket&lt;/span&gt;&lt;span&gt;) {&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;socket&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getAttachment&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;// joinedAt: Date&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;socket&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;`joined ${&lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;joinedAt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toISOString&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;span&gt;}&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;A missing or invalid attachment fails with a typed
&lt;code dir=&quot;auto&quot;&gt;WebSocketAttachmentError&lt;/code&gt;, so you decide whether to close the socket or
ignore it.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/hibernatable-websockets#validate-attachments-after-hibernation&quot;&gt;Hibernatable WebSockets → Validate attachments after hibernation&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;presigned-r2-urls-in-alchemy-dev&quot;&gt;Presigned R2 URLs in &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Presigned R2 URLs and S3 clients work under &lt;code dir=&quot;auto&quot;&gt;alchemy dev&lt;/code&gt; with no extra
configuration (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1793&quot;&gt;#1793&lt;/a&gt;).
The same code signs against the Worker’s local dev URL in dev and
against &lt;code dir=&quot;auto&quot;&gt;r2.cloudflarestorage.com&lt;/code&gt; when deployed:&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;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;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;Uploads&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;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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;presignPut&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;PresignPutObject&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; {&lt;/span&gt;&lt;/div&gt;&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;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;yield*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;presignPut&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;uploads/a.png&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; contentType&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;image/png&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;json&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;/div&gt;&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;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;PresignPutObjectToken&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Async Workers get the same thing through
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.R2.S3Credentials(bucket, { access: &quot;write&quot; })&lt;/code&gt;, which
delivers an endpoint and scoped keys for any S3 client. The local S3
endpoint runs inside the Worker’s existing workerd process, and the dev
proxy now answers &lt;code dir=&quot;auto&quot;&gt;Expect: 100-continue&lt;/code&gt;, which took a 3 MB AWS SDK
&lt;code dir=&quot;auto&quot;&gt;PutObject&lt;/code&gt; from ~6 s to ~130 ms.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/data/r2-presigned-urls&quot;&gt;R2 presigned URLs&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;queue-subscriptions-from-any-resource&quot;&gt;Queue subscriptions from any resource&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Queues.Subscription&lt;/code&gt; accepts a resource or a &lt;code dir=&quot;auto&quot;&gt;.ref(...)&lt;/code&gt; as
its &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1722&quot;&gt;#1722&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1505&quot;&gt;#1505&lt;/a&gt;) — including
one owned by another stack:&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;BucketEvents&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;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;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;Events&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;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;Bucket&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;Uploads&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;stack&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;storage&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;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;/div&gt;&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;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;Subscription&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;BucketEvents&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; uploads&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;bucket.created&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;bucket.deleted&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;queueId&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;.queueId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;Sources include Images, KV, R2, Vectorize, Workers, Workflows, and two
new resources: &lt;code dir=&quot;auto&quot;&gt;AI.Model&lt;/code&gt;, a handle on a Workers AI catalog model, and
&lt;code dir=&quot;auto&quot;&gt;R2.SuperSlurperJob&lt;/code&gt;, a one-off migration into R2 from S3 or another
bucket. Thanks &lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt; for the Workflow
sources and &lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workflow.ref&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/messaging/queues#use-resources-as-event-sources&quot;&gt;Queues → Use resources as event sources&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;acme-certificates&quot;&gt;ACME certificates&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;alchemy/ACME&lt;/code&gt; issues and renews certificates from Let’s Encrypt or any
ACME CA, independent of where they are used
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1702&quot;&gt;#1702&lt;/a&gt;).
&lt;code dir=&quot;auto&quot;&gt;Cloudflare.DNS.AcmeSolver&lt;/code&gt; answers DNS-01 challenges:&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;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;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;Wildcard&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;account&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;ACME&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Account&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;LetsEncrypt&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;ca&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ACME&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LetsEncrypt&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;termsOfServiceAgreed&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;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certificate&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;ACME&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Certificate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Wildcard&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;account&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;identifiers&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;solver&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;DNS&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AcmeSolver&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&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;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;CLOUDFLARE_ZONE_ID&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;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;Fly&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Certificate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Upload&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;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;/div&gt;&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;*.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;kind&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;custom&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;fullchain&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certificate&lt;/span&gt;&lt;span&gt;.chain&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;privateKey&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certificate&lt;/span&gt;&lt;span&gt;.privateKey&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;ACME.IssueCertificate&lt;/code&gt; binds an account into a Worker or Service for
runtime issuance, and &lt;code dir=&quot;auto&quot;&gt;Fly.WriteCertificates&lt;/code&gt; manages an App’s
certificates at runtime.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/acme&quot;&gt;ACME&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/acme/getting-started&quot;&gt;Getting started&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kubernetes-on-any-cluster&quot;&gt;Kubernetes on any cluster&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Kubernetes.LocalCluster&lt;/code&gt; starts a kind cluster with a local image
registry, and any connection can now name a registry, so workloads
built from &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; or a Docker context deploy to GKE, AKS, k3s, or your
laptop (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1779&quot;&gt;#1779&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;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;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;stage&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;Alchemy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Stage&lt;/span&gt;&lt;span&gt;;&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; (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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// any cluster kubectl can reach&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;Kubernetes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;KubeConfig&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&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;prod&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;registry&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;&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;&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;})&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&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;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;LocalCluster&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; { name&lt;/span&gt;&lt;span&gt;:&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;span&gt;;&lt;/span&gt;&lt;/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;Editing a &lt;code dir=&quot;auto&quot;&gt;Job&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;Deployment&lt;/code&gt;’s &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; program now redeploys it. A
new &lt;code dir=&quot;auto&quot;&gt;/kubernetes&lt;/code&gt; docs hub has a five-part tutorial that starts on
&lt;code dir=&quot;auto&quot;&gt;LocalCluster&lt;/code&gt; and ends on your own cluster.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/kubernetes&quot;&gt;Kubernetes&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/kubernetes/tutorial/part-1&quot;&gt;Tutorial&lt;/a&gt;
· &lt;a href=&quot;https://alchemy.run/kubernetes/clusters/local&quot;&gt;Local cluster&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;workflow-tasks-keep-typed-errors&quot;&gt;Workflow tasks keep typed errors&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Workflows.task&lt;/code&gt; accepts fallible Effects
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1723&quot;&gt;#1723&lt;/a&gt;). A failure
follows the task’s retry policy; once retries run out, &lt;code dir=&quot;auto&quot;&gt;catchTag&lt;/code&gt; sees
your error, including after Cloudflare replays the 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;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CardDeclined&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;Data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TaggedError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;CardDeclined&quot;&lt;/span&gt;&lt;span&gt;)&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;reason&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;}&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;chargeCard&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;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;fail&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;CardDeclined&lt;/span&gt;&lt;span&gt;({ reason&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`insufficient funds for ${&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;;&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;Checkout&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;Checkout&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;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;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; (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;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;Workflows&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;&quot;charge&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chargeCard&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;/div&gt;&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;2&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;1 second&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;exponential&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;/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;CardDeclined&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; (error) &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;succeed&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;declined&quot;&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;const&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; reason&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;.reason })&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&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;&lt;code dir=&quot;auto&quot;&gt;Effect.orDie&lt;/code&gt; still makes a failure terminal. Workflows can also take
an explicit account-global &lt;code dir=&quot;auto&quot;&gt;workflowName&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1460&quot;&gt;#1460&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/odysseaspapadimas&quot;&gt;Odysseas Papadimas&lt;/a&gt;! A
retries-only step config no longer crashes the engine
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1142&quot;&gt;#1142&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/apostolos-geyer&quot;&gt;apostoli&lt;/a&gt;! Each attempt gets its
own scope (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1701&quot;&gt;#1701&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/compute/workflows#application-errors-across-replay&quot;&gt;Workflows → Application errors across replay&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;vinext-support&quot;&gt;Vinext support&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;Website.Vinext&lt;/code&gt; deploys &lt;a href=&quot;https://github.com/cloudflare/vinext&quot;&gt;vinext&lt;/a&gt;
apps on Cloudflare, AWS, Fly, Hetzner, Railway, and Prisma
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1515&quot;&gt;#1515&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/xesrevinu&quot;&gt;Ray&lt;/a&gt;! Keep your ordinary
&lt;code dir=&quot;auto&quot;&gt;vinext()&lt;/code&gt; Vite config; no Alchemy plugin is needed.&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;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;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;{ providers&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;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;Cloudflare&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;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;Vinext&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;rootDir&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;env&lt;/span&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 vinext!&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; { url&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;/div&gt;&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;On Cloudflare it deploys a Worker with KV caching and prerender seeding,
without Wrangler or OpenNext. AWS runs it on streaming Lambda with an S3
cache behind CloudFront. Fly, Hetzner, Railway, and Prisma run vinext’s
Node server, with an in-memory cache by default and Redis through
&lt;code dir=&quot;auto&quot;&gt;REDIS_URL&lt;/code&gt;. Swap the provider namespace to move the same app:&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;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;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;{ providers&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;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;Cloudflare&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;&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;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;Vinext&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;const &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;Vinext&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;rootDir&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;env&lt;/span&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 vinext!&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;&lt;/span&gt;&lt;span&gt;return { url&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;/div&gt;&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; runs vinext’s native dev server with HMR, and
&lt;code dir=&quot;auto&quot;&gt;.pipe(Alchemy.remote())&lt;/code&gt; deploys it for real.&lt;/p&gt;
&lt;p&gt;Docs: &lt;a href=&quot;https://alchemy.run/cloudflare/frontend/vinext&quot;&gt;Cloudflare&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/aws/frontend/vinext&quot;&gt;AWS&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/fly/frontend/vinext&quot;&gt;Fly&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/hetzner/frontend/vinext&quot;&gt;Hetzner&lt;/a&gt; ·
&lt;a href=&quot;https://alchemy.run/railway/frontend/vinext&quot;&gt;Railway&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/prisma/frontend/vinext&quot;&gt;Prisma&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;nextjs-and-octane-with-less-config&quot;&gt;Next.js and Octane with less config&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Next.js on Cloudflare no longer needs &lt;code dir=&quot;auto&quot;&gt;open-next.config.ts&lt;/code&gt;, and
writable ISR is one prop
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1747&quot;&gt;#1747&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;IncCache&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;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;NextIncCache&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;TagCache&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;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;NextTagCache&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;const&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;=&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;Website&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; &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; &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;/div&gt;&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;isr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { incrementalCache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IncCache&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; tagCache&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TagCache&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/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;Octane apps no longer need a hosting adapter in &lt;code dir=&quot;auto&quot;&gt;octane.config.ts&lt;/code&gt; on
any provider (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1747&quot;&gt;#1747&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1755&quot;&gt;#1755&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1756&quot;&gt;#1756&lt;/a&gt;). SvelteKit
moves to &lt;code dir=&quot;auto&quot;&gt;3.0.0-next.27&lt;/code&gt;, and the Node target now ships client assets
and prerendered pages
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1709&quot;&gt;#1709&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/cam-mcevenue&quot;&gt;Cameron McEvenue&lt;/a&gt;! The Next.js Node
and Neon servers start from the built config, so a read-only deploy no
longer tries to download SWC
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1805&quot;&gt;#1805&lt;/a&gt;) — thanks
&lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;!&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;a href=&quot;https://alchemy.run/cloudflare/frontend/nextjs&quot;&gt;Next.js&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/frontend/octane&quot;&gt;Octane&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;local-development&quot;&gt;Local development&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No credentials needed for local-only stacks&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1801&quot;&gt;#1801&lt;/a&gt;). Cloudflare
authentication is deferred until a cloud call needs it, so a stack of
local Workers, KV, R2, and D1 runs without a profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider credentials resolve on first use&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1902&quot;&gt;#1902&lt;/a&gt;). Loading
provider layers no longer requires credentials for every provider.
When a cloud operation needs missing or unreadable credentials, plan
and apply fail with &lt;code dir=&quot;auto&quot;&gt;CredentialsRequired&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workerd restarts after a crash&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1772&quot;&gt;#1772&lt;/a&gt;) on the
same ports, so the dev URL keeps working. Raise the isolate’s heap with
&lt;code dir=&quot;auto&quot;&gt;ALCHEMY_WORKERD_V8_FLAGS=--max-old-space-size=4096&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1771&quot;&gt;#1771&lt;/a&gt;), and the
Vite module runner no longer retains every old module graph across HMR
edits (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1770&quot;&gt;#1770&lt;/a&gt;).
Thanks &lt;a href=&quot;https://github.com/agcty&quot;&gt;Alex&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private Websites answer service-binding calls in dev&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1798&quot;&gt;#1798&lt;/a&gt;) for
SvelteKit, Nuxt, Octane, Next.js, Astro, Waku, and Vocs, and a Vite
Worker with SPA fallback plus &lt;code dir=&quot;auto&quot;&gt;runWorkerFirst&lt;/code&gt; starts again
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1799&quot;&gt;#1799&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&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;p&gt;&lt;strong&gt;Provider requirements retain their types&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1895&quot;&gt;#1895&lt;/a&gt;) — fixes
prevent &lt;code dir=&quot;auto&quot;&gt;any&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;unknown&lt;/code&gt; from hiding required services in provider
layers, with stronger validation for provider implementations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Provider and runtime fixes for Effect stable&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1899&quot;&gt;#1899&lt;/a&gt;) — Worker
preview creation reuses an existing preview after a conflict, and
lifecycle fixes cover ACME, CloudFront KeyValueStore, ECS, IAM SAML
providers, IVS stream keys, Cloudflare AI evaluations, and Railway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AWS Client VPN&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1714&quot;&gt;#1714&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;ClientVpnEndpoint&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;ClientVpnTargetNetworkAssociation&lt;/code&gt;,
&lt;code dir=&quot;auto&quot;&gt;ClientVpnAuthorizationRule&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;ClientVpnRoute&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code dir=&quot;auto&quot;&gt;AWS.EC2.DefaultSecurityGroup&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1630&quot;&gt;#1630&lt;/a&gt;) manages
the rules on a VPC’s default security group, and ECS Services deploy
again after a failed rollout
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1650&quot;&gt;#1650&lt;/a&gt;). 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;RDS master secret policy and security drift&lt;/strong&gt; —
&lt;code dir=&quot;auto&quot;&gt;masterUserSecretResourcePolicy&lt;/code&gt; on &lt;code dir=&quot;auto&quot;&gt;DBInstance&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1598&quot;&gt;#1598&lt;/a&gt;), security
settings converge from desired state
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1599&quot;&gt;#1599&lt;/a&gt;), and a
stopped or failed instance fails fast with
&lt;code dir=&quot;auto&quot;&gt;DBInstanceReadinessBlocked&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1597&quot;&gt;#1597&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/bjornpagen&quot;&gt;Bjorn Pagen&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Least-privilege AWS bindings&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1357&quot;&gt;#1357&lt;/a&gt;) — exact
IAM actions per capability, versioned S3 reads and copies, and S3
notification reconciliation across Lambda, SQS, SNS, and EventBridge.
SQS queues also reconcile adoption and Standard ↔ FIFO changes. Thanks
&lt;a href=&quot;https://github.com/aryasaatvik&quot;&gt;Saatvik Arya&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;Cloudflare.Access.McpServer&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1658&quot;&gt;#1658&lt;/a&gt;) registers
upstream MCP servers with Access. Thanks
&lt;a href=&quot;https://github.com/dillionverma&quot;&gt;Dillion Verma&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Container images shared across stages&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1692&quot;&gt;#1692&lt;/a&gt;) —
Container builds are cached by default, and
&lt;code dir=&quot;auto&quot;&gt;publish: { repository: &quot;web&quot; }&lt;/code&gt; reuses images and layers across
stages. 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;&lt;code dir=&quot;auto&quot;&gt;Cloudflare.Container.ref&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1750&quot;&gt;#1750&lt;/a&gt;) — another
stack can read a container application like any other resource.
Thanks &lt;a href=&quot;https://github.com/Cyberistic&quot;&gt;Cyberistic&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Durable Object SQL migrations load at construction&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1736&quot;&gt;#1736&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;yield* Cloudflare.SqlMigrations(&quot;./drizzle&quot;)&lt;/code&gt; replaces importing
drizzle-kit’s &lt;code dir=&quot;auto&quot;&gt;migrations.js&lt;/code&gt;, and each migration commits atomically
with its history row.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Worker build input options&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1700&quot;&gt;#1700&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;build.input&lt;/code&gt; passes Rolldown input options such as &lt;code dir=&quot;auto&quot;&gt;resolve.alias&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare fixes&lt;/strong&gt; — full deploys keep &lt;code dir=&quot;auto&quot;&gt;version.tag&lt;/code&gt; and
&lt;code dir=&quot;auto&quot;&gt;version.message&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1754&quot;&gt;#1754&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/lukeomalley&quot;&gt;Luke O’Malley&lt;/a&gt;!), prebuilt Workers
keep explicit compatibility flags
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1725&quot;&gt;#1725&lt;/a&gt;),
Workers-for-Platforms uploads keep &lt;code dir=&quot;auto&quot;&gt;_headers&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;_redirects&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1802&quot;&gt;#1802&lt;/a&gt;), and DNS
records only treat a missing record as gone
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1800&quot;&gt;#1800&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Engine fixes&lt;/strong&gt; — completed Actions reuse their outputs when inputs
are unchanged, so downstream resources plan as no-ops
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1379&quot;&gt;#1379&lt;/a&gt;, thanks
&lt;a href=&quot;https://github.com/focux&quot;&gt;Leonardo E. Dominguez&lt;/a&gt;!); changing a
&lt;code dir=&quot;auto&quot;&gt;Config&lt;/code&gt; value read during a Worker’s Init now plans an update
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1837&quot;&gt;#1837&lt;/a&gt;); and
destroy cleans up every generation left by an interrupted replacement
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1704&quot;&gt;#1704&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 plan --adopt&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1811&quot;&gt;#1811&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/pltoledo&quot;&gt;Pedro Toledo&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Railway &lt;code dir=&quot;auto&quot;&gt;region&lt;/code&gt; places replicas&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1766&quot;&gt;#1766&lt;/a&gt;) on
&lt;code dir=&quot;auto&quot;&gt;Service&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;Function&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PlanetScale &lt;code dir=&quot;auto&quot;&gt;withReplication&lt;/code&gt;&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1777&quot;&gt;#1777&lt;/a&gt;) on
&lt;code dir=&quot;auto&quot;&gt;PostgresRole&lt;/code&gt; for logical-replication consumers. Thanks
&lt;a href=&quot;https://github.com/Makisuo&quot;&gt;Makisuo&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better Auth tutorial&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1732&quot;&gt;#1732&lt;/a&gt;) — a
six-part walkthrough from an Auth service to GitHub sign-in, adapted
from work by &lt;a href=&quot;https://github.com/xofromthemoon&quot;&gt;xofromthemoon&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prisma fixes&lt;/strong&gt; — dev commands default to &lt;code dir=&quot;auto&quot;&gt;NODE_ENV=development&lt;/code&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1703&quot;&gt;#1703&lt;/a&gt;) and
&lt;code dir=&quot;auto&quot;&gt;alchemy/Prisma&lt;/code&gt;, Fly, Hetzner, Railway, and Neon import without
&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/frontend-frameworks&lt;/code&gt; installed
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1815&quot;&gt;#1815&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/AmanVarshney01&quot;&gt;Aman Varshney&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/kristof-siket&quot;&gt;Kristof Siket&lt;/a&gt; for live branch
attachment coverage
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1359&quot;&gt;#1359&lt;/a&gt;)!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smaller installs&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;@effect/vitest&lt;/code&gt; is an optional peer again
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1816&quot;&gt;#1816&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;@aws-sdk/credential-providers&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;aws4fetch&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;undici&lt;/code&gt; are gone
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1665&quot;&gt;#1665&lt;/a&gt;, 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;Runtime directories and process cleanup&lt;/strong&gt; — a configured
&lt;code dir=&quot;auto&quot;&gt;.alchemy&lt;/code&gt; directory is honored everywhere
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1726&quot;&gt;#1726&lt;/a&gt;), and
&lt;code dir=&quot;auto&quot;&gt;Command&lt;/code&gt; wrappers get &lt;code dir=&quot;auto&quot;&gt;SIGTERM&lt;/code&gt; and a second to clean up
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1760&quot;&gt;#1760&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Declaration metadata&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1490&quot;&gt;#1490&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;Api.LogicalId&lt;/code&gt; keeps its literal type, and Stack references expose
&lt;code dir=&quot;auto&quot;&gt;stackName&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leaner preview packages&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1727&quot;&gt;#1727&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1681&quot;&gt;#1681&lt;/a&gt;) — a PR
publishes only the packages it affects plus their dependencies, and
fork PRs install from &lt;code dir=&quot;auto&quot;&gt;pkg.alchemy.run/alchemy/pr:&amp;#x3C;number&gt;:&amp;#x3C;sha&gt;&lt;/code&gt;. The
CLI ships plain JavaScript entrypoints with generated package exports
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1707&quot;&gt;#1707&lt;/a&gt;). Thanks
&lt;a href=&quot;https://github.com/BlankParticle&quot;&gt;Rahul Mishra&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test runner tags and plans&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1773&quot;&gt;#1773&lt;/a&gt;) —
&lt;code dir=&quot;auto&quot;&gt;alchemy-test&lt;/code&gt; gains &lt;code dir=&quot;auto&quot;&gt;--tags&lt;/code&gt; expressions, phased &lt;code dir=&quot;auto&quot;&gt;--plan&lt;/code&gt; runs, and a
&lt;code dir=&quot;auto&quot;&gt;--dry-run&lt;/code&gt; preview.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faster API reference&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1767&quot;&gt;#1767&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1774&quot;&gt;#1774&lt;/a&gt;) — one page
per service: 4,368 pages become 406, the docs build is 4× faster, and
old URLs redirect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SQL guides&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1737&quot;&gt;#1737&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1744&quot;&gt;#1744&lt;/a&gt;) — a
database comparison and deployment guides for AWS (including Aurora
and DSQL), Fly, Hetzner, Prisma, and Railway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A new landing page&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1775&quot;&gt;#1775&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1797&quot;&gt;#1797&lt;/a&gt;) built
around the dev → test → review → deploy loop, with a PR lifecycle
benchmark you can run from &lt;code dir=&quot;auto&quot;&gt;examples/cloudflare-preview-benchmark&lt;/code&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/gcp&quot;&gt;GCP&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/setup&quot;&gt;Setup&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/gcp/security/iam&quot;&gt;Bindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/neon&quot;&gt;Neon&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/neon/tutorial&quot;&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/environments/secret-providers&quot;&gt;Secret providers&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/doppler&quot;&gt;Doppler&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/environments/infisical&quot;&gt;Infisical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/sql/prisma/contracts&quot;&gt;Prisma ORM contracts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/fly/compute/services&quot;&gt;Fly Services&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/fly/compute/connecting-services&quot;&gt;Connecting Services&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/fly/compute/deployments&quot;&gt;Deployments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/compute/durable-objects&quot;&gt;Durable Objects&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/cloudflare/apis/effect-rpc&quot;&gt;Effect RPC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/cloudflare/data/r2-presigned-urls&quot;&gt;R2 presigned URLs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alchemy.run/acme&quot;&gt;ACME&lt;/a&gt; · &lt;a href=&quot;https://alchemy.run/kubernetes&quot;&gt;Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/blob/main/CHANGELOG.md#v200-beta80&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.79...v2.0.0-beta.80&quot;&gt;Compare v2.0.0-beta.79 → v2.0.0-beta.80&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Optimizing Alchemy&apos;s CI Workflows</title><link>https://alchemy.run/blog/2026-09-24-optimizing-ci/</link><guid isPermaLink="true">https://alchemy.run/blog/2026-09-24-optimizing-ci/</guid><description>Moving CI to Blacksmith, fixing cache bugs, switching to pnpm, running CI conditionally and cut website build times from 162s to 39s.</description><pubDate>Thu, 24 Sep 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As of writing this, Alchemy is a monorepo of almost 100 packages (86 of them are &lt;a href=&quot;https://distilled.cloud&quot;&gt;distilled&lt;/a&gt; SDKs), with a docs website with thousands of generated pages, regular CI checks, preview package publishing, tests for our local cloudflare runtime and a release pipeline that publishes to npm. Over past few weeks we made several CI improvements to make it so the contributors and their agents can iterate fast.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;swapping-out-github-runners-and-tooling&quot;&gt;Swapping out GitHub runners and Tooling&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Our first immediate improvement came from moving our workflows to &lt;a href=&quot;https://blacksmith.sh/?ref=alchemy.run&quot;&gt;Blacksmith&lt;/a&gt; runners (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1162&quot;&gt;#1162&lt;/a&gt;). Just by doing this we saw a huge improvement, let’s take a look at some numbers:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;check&lt;/td&gt;
&lt;td&gt;7.8 min&lt;/td&gt;
&lt;td&gt;4.8 min&lt;/td&gt;
&lt;td&gt;−38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cloudflare-tools&lt;/td&gt;
&lt;td&gt;16.2 min&lt;/td&gt;
&lt;td&gt;5.3 min&lt;/td&gt;
&lt;td&gt;−67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pr-package&lt;/td&gt;
&lt;td&gt;5.0 min&lt;/td&gt;
&lt;td&gt;3.2 min&lt;/td&gt;
&lt;td&gt;−36%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These numbers are compiled from a very short numbers of runs we had immediately after switching, since I started optimizing the CI pipeline soon after we don’t have much data to compare, but it’s clear that just by switching to Blacksmith made a difference already.&lt;/p&gt;
&lt;p&gt;We also switched our package manager from &lt;code dir=&quot;auto&quot;&gt;bun&lt;/code&gt; to &lt;code dir=&quot;auto&quot;&gt;pnpm&lt;/code&gt; (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1214&quot;&gt;#1214&lt;/a&gt;). Bun kept us giving trouble: it behaves weirdly around updating lock files when manually add/removing deps from &lt;code dir=&quot;auto&quot;&gt;package.json&lt;/code&gt;, fails randomly during install failures in CI, broke our publishing of packages when using &lt;code dir=&quot;auto&quot;&gt;workspace:&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;catalog:&lt;/code&gt; in dependencies, doesn’t respect &lt;code dir=&quot;auto&quot;&gt;publishConfig&lt;/code&gt; overrides, didn’t have deduping until &lt;code dir=&quot;auto&quot;&gt;1.4&lt;/code&gt;, doesn’t work without &lt;code dir=&quot;auto&quot;&gt;pkg.alchemy.run&lt;/code&gt; preview URLs since it doesn’t dedupe tarball url deps, and the list goes on.&lt;/p&gt;
&lt;p&gt;We are still supporting and using bun as our runtime, but our repo is stuck on bun &lt;code dir=&quot;auto&quot;&gt;1.3.13&lt;/code&gt; since later versions introduced a &lt;a href=&quot;https://github.com/oven-sh/bun/issues/32693&quot;&gt;bug in &lt;code dir=&quot;auto&quot;&gt;AsyncLocalStorage&lt;/code&gt;&lt;/a&gt; which breaks our test runner. This is yet to be fixed and our blocker for upgrading &lt;code dir=&quot;auto&quot;&gt;bun&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;All of our CI now runs on Blacksmith, except for &lt;strong&gt;npm releases&lt;/strong&gt;. Npm &lt;a href=&quot;https://docs.npmjs.com/trusted-publishers/&quot;&gt;trusted publishing&lt;/a&gt; only allows publishing from GitHub-hosted runners, GitLab.com, and CircleCI cloud. So we had to split releases in two jobs: build on Blacksmith, publish on GitHub. We don’t want this extra complexity, but npm has yet to &lt;a href=&quot;https://x.com/samgoodwin89/status/2085278917825552412&quot;&gt;allow trusted publishing from any other CI provider&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;name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&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-on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blacksmith-8vcpu-ubuntu-2404&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Build, Pack, Upload tarballs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;publish&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;needs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&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-on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ubuntu-latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;permissions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;id-token&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Publish tarballs using pnpm publish which handles everything&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;making-our-website-deploy-faster&quot;&gt;Making our website deploy faster&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Our docs site is a content heavy site. It used to have over 4k+ pages (and paired OG image for each page), most of them being generated specs from our jsdoc. It would take up to 25 min building and deploying all those pages and assets.
&lt;a href=&quot;https://astro.build/blog/astro-720/&quot;&gt;Astro 7.2&lt;/a&gt; shipped &lt;a href=&quot;https://docs.astro.build/en/reference/experimental-flags/incremental-build/&quot;&gt;experimental incremental builds&lt;/a&gt;, which skip building pages that haven’t changed. We enabled it, patched Starlight to support it, and persisted the cache across CI runs (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1128&quot;&gt;#1128&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1136&quot;&gt;#1136&lt;/a&gt;). Now a warm build restores most of the pages and almost all OG images.&lt;/p&gt;
&lt;p&gt;But the biggest improvement came from changing how the API references are generated. We had one page per resource totaling to 4,368 pages. We merged them into one page per service (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1767&quot;&gt;#1767&lt;/a&gt;, &lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1774&quot;&gt;#1774&lt;/a&gt;).&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&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;Reference pages&lt;/td&gt;
&lt;td&gt;4,368&lt;/td&gt;
&lt;td&gt;406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold build&lt;/td&gt;
&lt;td&gt;162 s&lt;/td&gt;
&lt;td&gt;39 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output size&lt;/td&gt;
&lt;td&gt;3.64GB&lt;/td&gt;
&lt;td&gt;438MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Website CI run (median)&lt;/td&gt;
&lt;td&gt;8.0 min&lt;/td&gt;
&lt;td&gt;4.1 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Along with that, Website previews in PRs used to deploy a new Worker each time. Now they’re versions of a single stable preview Worker, so assets already uploaded from &lt;code dir=&quot;auto&quot;&gt;main&lt;/code&gt; are reused (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1267&quot;&gt;#1267&lt;/a&gt;). Deploys on PRs are still only triggered when &lt;code dir=&quot;auto&quot;&gt;deploy-website&lt;/code&gt; tag is used, and doesn’t work on fork PRs yet.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;conditional-test-runs-workflow-concurrency-and-cancellation&quot;&gt;Conditional Test runs, workflow concurrency and cancellation&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We went through our runs to find where we were burning minutes (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1362&quot;&gt;#1362&lt;/a&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New pushes in the PR didn’t cancel the already ongoing runs, so every commit was still running the full CI even though our agents had already pushed more commits to the branch. Now we cancel the old runs in the same group.&lt;/li&gt;
&lt;li&gt;Cloudflare tooling tests always ran, regardless of if anything related to it happened in the PR. Now we have scoped it to only run when its packages change.&lt;/li&gt;
&lt;li&gt;We were accidentally deleting our stable preview workers. Now that’s fixed, so wiping our test account doesn’t force a full asset upload.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;rewriting-pkgalchemyrun&quot;&gt;Rewriting &lt;code dir=&quot;auto&quot;&gt;pkg.alchemy.run&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1516&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@alchemy.run/pkg&lt;/code&gt;&lt;/a&gt; publishes every PR’s packages to an installable URL, like &lt;a href=&quot;https://github.com/stackblitz-labs/pkg.pr.new&quot;&gt;pkg.pr.new&lt;/a&gt;. We built our own version of this as soon as we hit pkg.pr.new’s limits, and we host it on Cloudflare with Alchemy. We recently rewrote it so now it supports everything:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fork PRs can publish without secrets, because each publish is verified against the GitHub Actions run that built it (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1681&quot;&gt;#1681&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Previews can publish only the packages a change affects (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1727&quot;&gt;#1727&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Previews stay alive while their PR is open (&lt;a href=&quot;https://github.com/alchemy-run/alchemy/pull/1511&quot;&gt;#1511&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;thanks-to-blacksmith&quot;&gt;Thanks to Blacksmith&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Huge shoutout to our friends at &lt;a href=&quot;https://blacksmith.sh/?ref=alchemy.run&quot;&gt;Blacksmith&lt;/a&gt; for sponsoring our CI runners. We are utilizing their fast Linux, macOS, and Windows runners. We found Github runners so slow that we were splitting our workloads. With blacksmith’s fast runners we just throw our tests across platforms, deploy our content-heavy website, and run checks without having to even think about it.&lt;/p&gt;
</content:encoded></item><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;https://pkg.alchemy.run/alchemy/bea0366&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;Operation&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;https://pkg.alchemy.run/alchemy/bea0366&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@main&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></channel></rss>