VAL_TOWN_API_KEY= VALS= Set up Vals from Val Town on this VM by following the exe.dev recipe at https://exe.dev/deploy/migrate-val-town.md from top to bottom. The values at the top of this message are mine: - VAL_TOWN_API_KEY: a Val Town API token with read access to vals (Settings → API Tokens); only to list and export your vals, and leave it out to move only public vals - VALS: which vals to move, written `user/val`; leave empty for all of them Ask me for any that still say before you need them. The recipe's example VM name is my-vals. This VM's name is the output of `hostname`: use it wherever the recipe writes my-vals. Skip the step that creates the VM; you are on it. You are done when all of these are true. Check each one yourself: - Every val's code exported to `~/valtown-export`, with each file's trigger and the names of its environment variables. - HTTP vals running as services that restart on reboot, each on its own private port, and the ones you choose at `https://.exe.xyz//`. - Cron vals on systemd timers, in UTC, with `lastRunAt` carried from run to run. - Email vals answering mail to `@.exe.xyz`. - std/sqlite, std/blob, std/email, and std/openai working on the VM without code changes. - A report of each val's schedule, secrets, and data to bring over, and any line still calling Val Town. Read the whole recipe, including the closed details, and follow "Move the vals by hand" in order, skipping VM creation; the walkthrough above it is for the owner. Install exactly the pinned Deno version. Put the API key in ~/.valtown-api-key (mode 600) and keep it, the export token, and every secret value out of your replies and out of Git. Never change anything on Val Town yourself: adding export-data.ts, setting variables, pausing vals, and redirects are the owner's steps. Ask the owner for each cron val's schedule (the API doesn't return it). Don't run share set-public or share receive-email; give the owner those commands. Leave vals whose secrets are missing stopped. If a val uses a Val Town feature this kit doesn't replace, list it in the report rather than rewriting the val. Finish with the report from "Check": per val, its triggers, port, schedule, email address, missing secrets, data still to copy, and prepare.ts's leftover lines; then the owner's steps in "Make the move". Finish with the URLs I should open.