<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>sigh.dev - Scott Cooper&apos;s dev blog - #cloudflare</title><description>sigh.dev is Scott Cooper&apos;s dev blog about TypeScript, React, San Francisco, and the web. - Posts tagged with &quot;cloudflare&quot;</description><link>https://sigh.dev/</link><item><title>You can just port things to Cloudflare Workers</title><link>https://sigh.dev/posts/you-can-just-port-things-to-cloudflare-workers/</link><guid isPermaLink="true">https://sigh.dev/posts/you-can-just-port-things-to-cloudflare-workers/</guid><description>Vibecoding, Vibeporting?</description><pubDate>Sun, 25 Jan 2026 08:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This January I decided to double down on using up my &lt;a href=&quot;/posts/addicted-to-free-ai-credits/&quot;&gt;free ai credits&lt;/a&gt; by building a few projects on Cloudflare Workers. I’ve always really liked the idea of this platform that has cheap/free resources, but every time I build larger things on it I run into limits that make me frustrated and move to cheap vps hosting like fly.io or DigitalOcean.&lt;/p&gt;
&lt;p&gt;Is vibeporting a word? Maybe it should be?&lt;/p&gt;
&lt;h1&gt;&lt;a class=&quot;not-prose&quot; href=&quot;#datasette-ts&quot;&gt;Datasette-ts&lt;/a&gt;&lt;/h1&gt;
&lt;figure&gt;&lt;a class=&quot;content-image-link&quot; href=&quot;./datasette.png&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Datasette running on Cloudflare Workers&quot; title=&quot;Click to open in new tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1964&quot; height=&quot;1272&quot; src=&quot;/_astro/datasette.lR6-YtED_233bVL.webp&quot; srcset=&quot;/_astro/datasette.lR6-YtED_DHcnO.webp 640w, /_astro/datasette.lR6-YtED_1lQtBx.webp 750w, /_astro/datasette.lR6-YtED_ZYtjVw.webp 828w, /_astro/datasette.lR6-YtED_Z1T6aTX.webp 1080w, /_astro/datasette.lR6-YtED_Z1WrAH6.webp 1280w, /_astro/datasette.lR6-YtED_16XG7w.webp 1668w, /_astro/datasette.lR6-YtED_233bVL.webp 1964w&quot; /&gt;&lt;/a&gt;&lt;figcaption class=&quot;image-subtext&quot;&gt;A port of Datasette to Cloudflare Workers&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Over holiday break, I was reading some of &lt;a href=&quot;https://simonwillison.net/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Simon Willison’s posts about AI&lt;/a&gt; and I checked where it’s currently possible to deploy it. You can deploy it pretty much everywhere but NOT on Cloudflare Workers, due to workers not really supporting much of Python’s ecosystem. I pointed Codex with GPT-5.2 Codex high/medium at the Datasette repo and had it break it down into README tasks and slowly do them one at a time. I’m not yet convinced by the crazy subagent stuff or that worktrees are worth it.&lt;/p&gt;
&lt;p&gt;As I got into it, it was clear I needed to narrow down the scope. Mr. Willison has built a very mature project that has a plugin system and a ton of features built-in and it depends on subdependencies that he also has published like sqlite-utils. Obviously, what I wanted is something that feels similar and runs on Cloudflare Workers. I picked up Drizzle, Hono, and Alchemy to handle Cloudflare deployments. I chose not to rebuild the frontend as a React SPA instead rendering something similar to the original Jinja templates using Hono’s JSX.&lt;/p&gt;
&lt;p&gt;Anyway, it ends up working pretty well. You can see a live demo at &lt;a href=&quot;https://datasette-legislators.sigh.dev/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;datasette-legislators.sigh.dev&lt;/a&gt; and the source is available below. I can’t say the code is in a good state, but it lives here &lt;a href=&quot;https://github.com/scttcper/datasette-ts&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;https://github.com/scttcper/datasette-ts&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;&lt;a class=&quot;not-prose&quot; href=&quot;#sesnoop&quot;&gt;SESnoop&lt;/a&gt;&lt;/h1&gt;
&lt;figure&gt;&lt;a class=&quot;content-image-link&quot; href=&quot;./sesnoop.png&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;SESnoop running on Cloudflare Workers&quot; title=&quot;Click to open in new tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2712&quot; height=&quot;2030&quot; src=&quot;/_astro/sesnoop.C6_5umH9_6I98D.webp&quot; srcset=&quot;/_astro/sesnoop.C6_5umH9_Z7vDFx.webp 640w, /_astro/sesnoop.C6_5umH9_Z24bGBN.webp 750w, /_astro/sesnoop.C6_5umH9_1wFp8k.webp 828w, /_astro/sesnoop.C6_5umH9_Z8l2QN.webp 1080w, /_astro/sesnoop.C6_5umH9_ZhGSUF.webp 1280w, /_astro/sesnoop.C6_5umH9_Z1FyIf3.webp 1668w, /_astro/sesnoop.C6_5umH9_umF3j.webp 2048w, /_astro/sesnoop.C6_5umH9_Z1aKnlE.webp 2560w, /_astro/sesnoop.C6_5umH9_6I98D.webp 2712w&quot; /&gt;&lt;/a&gt;&lt;figcaption class=&quot;image-subtext&quot;&gt;A port of Sessy to Cloudflare Workers&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Another Cloudflare Worker port, this time of a Rails app called &lt;a href=&quot;https://sessy.do&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Sessy&lt;/a&gt;. I decided to rename it because I was going for a different vibe. I send a bunch of emails via SES for xmplaylist.com and I was looking into running Sessy to handle the bounces and complaints, however I can’t get myself to think about Ruby for more than 1 minute. So again I pointed Codex at the Sessy repo and a few other Cloudflare/Hono example repos and had it build out a monorepo where the worker handles the api and Cloudflare assets serves a React SPA frontend.&lt;/p&gt;
&lt;p&gt;I think what was hard to reel in was how much frontend it was willing to build before I could stop it and start bringing in shadcn components. Like it made a bunch of select components and things that were generally pretty ugly. So then you have to tell it to replace all the ugly things with premade shadcn + baseui components.&lt;/p&gt;
&lt;p&gt;This project took a bit more work to get working outside of pointing AI at the code. It made a number of Cloudflare mistakes, tests were difficult to get working 100% correctly. One example was that it put the webhook at &lt;code&gt;/webhook&lt;/code&gt; which Cloudflare would attempt to load as an asset since the worker is bound to &lt;code&gt;/api&lt;/code&gt; which is always a bit of a headscratcher until you remember how this all works. It was really cool getting to know how SNS works with SES and watching them flow into D1 is fun.&lt;/p&gt;
&lt;p&gt;I tried publishing this package to npm and it kinda works to deploy to cloudflare if alchemy is setup. Or you can run it locally with &lt;code&gt;npx datasette-ts@latest serve ./legislators.db&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I don’t have a live demo, but you can check out the source code at &lt;a href=&quot;https://github.com/scttcper/sesnoop&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;scttcper/sesnoop&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;&lt;a class=&quot;not-prose&quot; href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pretty happy with how both of these turned out. I didn’t exclusively use Codex on either of them, however Codex was the main driver 95% of the time. I think Codex w/ GPT-5.2 Codex on high or medium is a great model and through the team plan you can basically run medium as long as you want. I exhausted about 1 week worth of the plan I’m on for Codex for each project.&lt;/p&gt;</content:encoded><category>vibecoding</category><category>cloudflare</category><category>typescript</category><category>ai</category></item></channel></rss>