xanosdk deploy deploys to
it, with no Xano account and no network round-trip once the Engine is cached. It runs the same
imports, statements and tests as an ephemeral in Xano’s cloud.
Deploy to the Engine
In a scaffolded project, deploy to the Engine with thexano:deploy script:
On Windows or an Intel Mac? There is no Xano Engine build for your machine yet. Wherever this
page says
npm run xano:deploy, run npm run xano:deploy:ephemeral instead: it deploys the same
code to an ephemeral in Xano’s cloud. That needs a Xano account, so sign in first
(Connect to Xano). See
where the Engine differs today.xanosdk deploy ./xano/index.ts --keep-data. On a fresh machine
the first deploy downloads the newest Engine for your platform, checks it against the sha256 its
release recorded, starts it, and imports your backend. Each Engine version downloads once per
machine and is shared by every project on it.
- The backend URL. Your APIs answer there, on loopback only.
- A sign-in link to the Xano editor on the Engine. Browse your tables and see what your code
compiled to. The link carries a session, so treat it as a credential.
xanosdk impersonateopens the same session later (--url-onlyprints it,--guestmakes it read-only). - The MCP server a coding agent connects to. See Engine MCP server.
Your frontend follows the deploy
In a scaffolded project, a deploy that publishes no static site writes the Engine’s URL into.env.local as VITE_XANO_HOST, inside a marked block that leaves your own values alone.
Restart npm run dev to pick it up. --no-dev-env turns the write off. A .env.local that your
repo does not gitignore is reported, never written. To have the Engine serve a built frontend
instead, see Frontend hosting.
Commit the pin
The first deploy pins the Engine version inpackage.json, creating the file if the project has
none:
- A newer Engine is offered, never applied. Each deploy checks at most once an hour. In a
terminal it asks, defaulting to no. In CI, piped output or
--jsonit prints one line and keeps the pin.XANOSDK_NO_UPDATE_CHECK=1turns the check off. xanosdk local updatemoves the pin on purpose to the latest Engine, or to--version v0.1.14(downgrades included). It downloads that version and restarts this project’s Engine on it. Commitpackage.jsonafterwards.- A teammate’s pin change reaches you on your next deploy. When the running Engine is on a different version from the pin, the deploy stops it, starts the pinned one, and says so.
Keep your rows between deploys
The scaffoldednpm run xano:deploy passes --keep-data, so rows you enter through your app
survive each code change:
- The first deploy seeds. The Engine starts empty, and your tables get their seed rows.
- Every later deploy merges. Code and schema changes land, objects you removed are deleted, and existing rows stay. Seed rows are not written again.
--resetstarts over.npm run xano:deploy -- --resetreplaces the Engine’s backend and seeds it fresh.
--keep-data deploy seeds it instead of merging (see
below).
Work against it
After a deploy to the Engine, it is the backend this project tracks. These commands reach it with no flag and no Xano account:local, or
local:<name> for another Engine from xanosdk local list (for example
xanosdk test run-all --on local).
A script that calls the meta API needs the Engine’s own bearer. xanosdk local token prints it on
stdout, so it works in a subshell:
--json adds the Engine’s URL and workspace id. A restart mints a new bearer, so read it again
after one. The bearer is never written to disk or printed in a deploy summary.
Manage engines
An Engine has no expiry, and nothing on a server reclaims it. These commands see and stop them. Each Engine is named after its project’s path (xanosdk- plus 12 hex characters), and token,
mcp and update default to this project’s Engine.
Run a different Engine without moving the pin
To try an experimental build, or a published version the project has not moved to, override the pin for your own runs:https URL to an Engine archive, or a path to one. The flag beats
the variable, and the variable beats the pin. An override never reads or writes the pin and never
checks for updates. Plain http:// is refused unless the host is this machine.
Two more variables apply to overrides and release lookups:
XANOSDK_ENGINE_TOKENis sent only to an override URL’s host, for a private archive.XANOSDK_ENGINE_RELEASES_URLpoints version lookups at a different Engine release service. Its Engines download fresh on every deploy, andxanosdk local updaterefuses while it is set.
Disk use
Engine binaries and the runtime data a running Engine keeps (unpacked runtime files, logs, records of running Engines) live in~/.xanosdk/local-engine. Set XANOSDK_ENGINE_HOME to move it. Expect
roughly 600 MB after the first deploy, and a similar amount for each Engine version you run.
Where the Engine differs today
The Engine is the same backend as an ephemeral. Three gaps change a command you run today:-
You cannot cut a release from the Engine.
xanosdk release createrefuses it by name, because a release is cut on your Xano instance. Deploy to an ephemeral first, then cut the release from there:You can also stage on a Xano branch of your workspace and cut from it withxanosdk release create v1.4.0 --from workspace --branch <label>. See Releases. -
There is no Engine build for Windows or Intel Macs. The Engine runs on macOS (Apple
silicon) and Linux (x64, arm64). On any other platform a deploy to the Engine is refused before
anything compiles. Use
npm run xano:deploy:ephemeralto deploy to an ephemeral instead. -
An Engine update or restart starts it empty. Rows do not survive
xanosdk local update, a version change, or a restart. The next--keep-datadeploy seeds the Engine instead of merging. Treat rows on the Engine as scratch data.
Next
- Connect your coding agent to the Engine: Engine MCP server.
- Put the same backend in Xano’s cloud: Ephemerals.
- Every flag on
deployandlocal: CLI reference.