MigrationVal Town
Migrate from Val Town
Start with a test deployment, then migrate the services your app uses.
Migrate with an AI agent
Migrate my Val Town vals to Easel, following https://easel.sh/docs/migration/val-town.
1. List my vals, group vals that share data or import each other into apps, and ask me which apps to keep.
2. Keep a tracker with one row per app: its vals, HTTP routes and methods, scheduled jobs, email addresses, environment variable names, std/ services, and source visibility.
3. Propose a plan per app, and wait for my approval.
4. Before December 10, 2026, add the export files and write freeze to the original vals.
5. Make each repository private unless every val in it is public. Keep credits and licenses for copied code.
6. Run `easel link` before the first `easel deploy`, and confirm the target of every deployment.
7. Never print secrets. Ask me before you deploy to production, change DNS, or add a val.run redirect.
Give this prompt to a coding agent connected to
Val Town's MCP server and
signed in with npx easel-sh login. To migrate by hand, follow the steps below.
Val Town code becomes read-only on December 10, 2026, and vals stop running on January 10, 2027. Add the temporary export files for your data to your vals before December 10, while you can still change their code.
What runs where
Easel runs your HTTP handlers as Functions, your static files on the CDN, and your scheduled jobs on Easel Schedules. Databases, object storage, email, and AI run on third-party services that your code reaches through environment variables.
Migrate an app
- Move the code and deploy a preview.
- Transfer the environment variables, with test credentials for Preview.
- Follow the guide for each feature the app uses:
| If your app uses | Follow |
|---|---|
std/sqlite | Migrate SQLite |
std/blob | Migrate blobs |
| Cron or interval vals | Migrate scheduled jobs |
Email vals or std/email | Migrate email |
std/openai | Migrate AI |
| Restricted app access | Migrate access |
A custom domain or shared val.run URLs | Migrate domains |
Switch to production
Only one copy of the app should write data or run jobs at a time:
- Stop writes and disable cron vals on Val Town.
- Copy the final data: a fresh SQLite export, and the final blob sync.
- Deploy to production with
npx easel-sh deploy --prod, then point domains, webhooks, and email at Easel. - Add
val.runredirects once everything works.