Val Town is winding down. Founder Steve Krouse announced on November 10, 2026 that signups are closed, code goes read-only on December 10, and all services end on January 10, 2027.
If you have HTTP vals, cron jobs or email handlers running there, you have about two months to move them. The good news is that Val Town has published detailed migration guides.
This guide covers the key dates, how to export your code and data, and which alternative fits you best.
- Dec 10, 2026: code becomes read-only (SQLite and blob storage stay writable). Redirects you set become permanent.
- Jan 10, 2027: all services end. Vals stop running.
- Feb 1, 2027: Val Town plans to open-source the platform.
- Best match: Val Town calls Cloudflare “the most feature-equivalent platform” and is moving its own vals there.
- Avoid Deno Deploy: Deno announced on October 9, 2026 that Deno Deploy will shut down after six months.
What Happened and Why
Val Town was a popular place to write small TypeScript functions (“vals”) in the browser and run them instantly as APIs, cron jobs or email handlers. It ran on the Deno runtime.
In the announcement, Krouse says the company could not compete in the cloud computing space. He frames it as good news for users, because there are many strong hosting providers to move to.
What happens to paid plans
- Billing: paused from November 10, 2026.
- Existing subscriptions: keep working for free until shutdown.
- Annual prepaid plans: get a partial refund.
- Help: email support@val.town or ask in the Val Town Discord.
Key Dates You Must Know
| Date | What changes | What you should do |
|---|---|---|
| Nov 10, 2026 | New signups and plan upgrades end. Billing pauses. | Make a list of every val you rely on. |
| Dec 10, 2026 | Code becomes read-only (except SQLite and blob storage). Redirects become permanent. | Finish code export and set val.run redirects before this date. |
| Jan 10, 2027 | All other services end. | Have data copied and new hosts live. |
| Feb 1, 2027 | Val Town plans to open-source the platform. | Optional: self-host later if you want. |
Warning: After December 10 you cannot edit code or change redirects. Treat that as your real deadline, not January 10.
How to Export Your Vals
Val Town’s own docs say the first step is getting your code into Git. You have three main ways to do that.
Option 1: The vt CLI
- Install Deno. The vt CLI runs on Deno, so install it from the Deno website first.
- Install vt. Run
deno install -grAf jsr:@valtown/vtin your terminal. - Log in. Run
vton its own. It walks you through login. - Clone each val. Run
vt cloneand pick the val. Say “Yes” when it offers to add editor files, thencdinto the folder. - Commit to Git. Run
git init, add a.gitignorefirst, then commit and push to a private GitHub repo.
Option 2: GitHub sync
Val Town has a GitHub sync feature with guides for syncing val code and using GitHub Actions with the vt CLI. It is handy if you have many vals to back up.
Option 3: Let an AI agent do it
Val Town’s migration overview includes a ready-made prompt. It asks your agent to install the Val Town plugin or MCP server, list which vals to keep, choose a platform and propose a plan for your approval.
The announcement even says today’s LLMs are good at these migrations. If you use Claude Code, see my Claude Code MCP setup guide to connect the server.
What to clean up in the code
esm.townimports: copy those val files into your project and use relative imports, keeping licences.npm:and CDN imports: install the package and add it topackage.json.- Deno-only APIs: swap them for standard Web or Node APIs.
- Secrets: never commit env values,
.envfiles or database exports.
Tip: Add your .gitignore before the first commit. Ignoring a file later does not remove it from Git history.
How to Export SQLite, Blobs and Secrets
Code is only half the job. Val Town’s docs give careful, step-by-step guides for data, mainly written for Cloudflare but useful anywhere.
SQLite data
- Find the right database. Check if the app uses its own database or the older account-wide one. Note tables, indexes and row counts.
- Add a temporary export endpoint. Val Town’s guide provides an HTTP file that dumps your tables as SQL, protected by a
SQLITE_EXPORT_TOKENsecret. - Pause writes. Stop jobs that write to these tables.
- Download the dump. Run the guide’s script, passing the token through the environment. Check the file ends with
-- Export complete. - Import into the new database. For Cloudflare D1, remove the dump’s
BEGIN TRANSACTIONandCOMMITlines, then run the import command below. - Clean up. Delete the export endpoint and the token once the import is verified.
npx wrangler d1 execute DATABASE_NAME --remote --file=app.sql
Note: Val Town SQLite is powered by Turso, so Turso is another natural home for that data if you do not want D1.
Blob storage
List your blob keys with pagination and copy the actual bytes, keeping keys and content types. Then compare counts, sizes and hashes before switching. A failed or rate-limited listing does not mean the store is empty.
Environment variables and secrets
Val Town does not recommend a plain export of all env vars. Its guide uses an encrypted transfer: you make a key pair locally, encrypt the chosen secrets inside Val Town, then decrypt locally and pipe them to wrangler secret bulk.
If you only have a couple of keys, the simplest safe path is to copy them from the original provider (for example, regenerate an API key) and set them on the new host.
Best Val Town Alternatives
Here is how the main options map to Val Town features, based on Val Town’s own “where to migrate” table. “Yes” means a built-in product.
| Provider | Website / HTTP | SQLite | Blob | Cron | Free plan | |
|---|---|---|---|---|---|---|
| Cloudflare Workers | Yes | Yes (D1) | Yes (R2) | Yes | Yes | 100,000 requests/day |
| Vercel | Yes | No | Yes | Yes | No | Hobby: 1M function invocations, non-commercial only |
| Netlify | Yes | No | Yes | Yes | No | Check Netlify pricing |
| Render | Yes | No | No | Yes | No | Check Render pricing |
| Railway | Yes | No | Yes | Yes | No | Check Railway pricing |
| Supabase | No | Yes | Yes | Yes | No | Check Supabase pricing |
Cloudflare Workers: the closest match
Val Town calls Cloudflare “the most feature-equivalent platform” and is moving its own blog and docs there. Its guide maps every Val Town piece to a Cloudflare product.
- HTTP vals: a Worker
fetch()handler. - Cron vals: Cron Triggers with a
scheduled()handler. - Email vals: Email Routing.
std/sqlite: D1.std/blob: R2.std/openai: AI Gateway.
The free plan gives 100,000 requests per day and 10 ms CPU per request. The paid plan starts at $5 per month with 10 million requests included. D1 free gives 5 GB of storage, and R2 free gives 10 GB a month with free egress.
Vercel: great for web apps
Val Town says Vercel has “almost all of the features from Val Town built-in” or via its Marketplace. The free Hobby plan includes 1,000,000 function invocations a month, but it is for personal, non-commercial use only.
Other good picks
- Netlify: similar to Vercel, with Netlify Blobs and Scheduled Functions.
- Render: solid web hosting plus built-in Cron Jobs.
- GitHub Actions: fine for simple scheduled scripts with no web endpoint. See my GitHub Actions setup guide for a primer.
- Vibe coding tools: Val Town’s docs also mention Lovable, Replit, v0 and Claude Artifacts for prototypes.
Why Not Deno Deploy?
Deno Deploy looks like the obvious home, since vals already run on Deno. But on October 9, 2026, Ryan Dahl announced that the Deno team is joining Cloudflare.
The Deno blog says “Deno Deploy will continue operating for six months before shutting down.” Paying customers get migration help to Cloudflare Workers. The Deno runtime gets one more year of monthly bug fix and security releases.
Step by Step: Move an HTTP Val to Cloudflare Workers
Here is a simple path for a typical HTTP val. It uses standard Cloudflare commands plus the Val Town guides above.
- Create a Cloudflare account. Then install Node.js, which you need for Wrangler.
- Create a Worker project. Run
npm create cloudflare@latest -- my-valand pick a “Hello World” Worker. - Move your handler code. Put your val’s request logic inside the
fetch(request, env, ctx)handler insrc/index.jsorsrc/index.ts. - Fix imports. Install npm packages and replace
esm.townimports with local files. - Add bindings. Add D1, R2 or cron settings to your Wrangler config file.
- Set secrets. Use
npx wrangler secret put NAMEfor each key, or the Val Town encrypted transfer. - Test locally. Run
npx wrangler devand hit your endpoints. - Deploy. Run
npx wrangler deployand test the liveworkers.devURL. - Redirect. Point your old
val.runURL to the new address (next section).
A minimal Worker looks like this:
export default {
async fetch(request, env, ctx) {
return new Response("Hello from my migrated val!");
},
};
Moving a cron val
Add the schedule to your Wrangler config and put the job in a scheduled() handler. Cloudflare Cron Triggers use UTC, so convert local times.
{
"triggers": { "crons": ["0 * * * *"] }
}
export default {
async scheduled(event, env, ctx) {
await runJob(env, event.scheduledTime);
},
};
Disable the Val Town schedule before you turn on the Cloudflare one, so jobs do not run twice.
Redirect Your val.run URLs
Val Town lets you redirect each *.val.run URL to its new home. Set these after the new app is fully working, because the val stops getting requests once a redirect is set.
- Per val: open the val’s settings, scroll to HTTP, click the arrow next to the endpoint and add the redirect location.
- All at once: go to
val.town/settings/domains, open Custom Domains, find Val.run redirects and add each target. - Update webhooks directly: many webhook senders do not follow redirects, so change those URLs at Stripe, GitHub and so on.
Path and query strings carry over by default. On December 10, 2026, every redirect you have set becomes permanent. Custom domains are not covered, so change their DNS with your domain provider.
My Take
This is sad news. Val Town made “write a function, get a URL” feel magical, and plenty of small tools depend on it.
That said, the shutdown is handled well. Two months of notice, paused billing, permanent redirects and AI-friendly migration docs are much better than most closures.
My advice is simple. Move to Cloudflare Workers unless you have a strong reason not to, finish before December 10, and skip Deno Deploy. If you plan to use an AI agent, an AGENTS.md file describing your vals will help it a lot.
Troubleshooting: Common Problems and Fixes
vtcommand not found: make sure Deno is installed and its bin folder is on your PATH, then reinstall withdeno install -grAf jsr:@valtown/vt.- Imports fail after moving: search your code for
esm.townandhttps:imports and replace them with npm packages or local files. - SQLite dump will not import into D1: remove the
BEGIN TRANSACTIONandCOMMITlines and keep tables in foreign-key order. - Downloaded dump looks wrong: if it does not end with
-- Export complete, or is an HTML login page, delete it and download again. - Cron runs at the wrong hour: Cloudflare uses UTC. Convert your old local-time schedule.
- Webhooks stopped working: the sender probably does not follow redirects. Update the URL in the provider’s dashboard.
- Vercel warns about usage: the Hobby plan is non-commercial. Use Pro or Cloudflare for business tools.
Frequently Asked Questions
When does Val Town shut down?
Code becomes read-only on December 10, 2026, and all services end on January 10, 2027. Signups closed on November 10, 2026.
Will I get a refund?
Billing is paused and existing subscriptions run free until shutdown. Annual prepaid customers get a partial refund.
What is the best Val Town alternative?
Val Town itself calls Cloudflare the most feature-equivalent platform. Vercel is a strong choice for web apps.
Can I still move my vals after December 10?
Your vals keep running until January 10, 2027, but code becomes read-only. Export code and set redirects before December 10 to be safe.
Should I move to Deno Deploy?
No. Deno announced on October 9, 2026 that Deno Deploy will shut down after six months of operation.
Will Val Town be open source?
Yes, Val Town plans to open-source the platform on February 1, 2027. The announcement does not name a licence.
What happens to my val.run URLs?
You can redirect them to new addresses until December 10, 2026, when the redirects become permanent.




