fluid sites publish saves your folder to the Site’s source repository, uploads your build output and declarations, and makes them the Site’s current version in one step. Until that step succeeds, the Site keeps serving its current version.
fluid deploy wraps the whole path for a project folder: it builds, creates the Site the first time, and publishes. Mist’s Publish button and the Fluid MCP server publish the same way.
For a direct API integration, see Sites APIs.
Before you start
Install the Fluid CLI and its Sites plugin, and sign in. The CLI needs Node.js 24 or later, and Git to save the Site’s source:--as member or --as admin. Without it, the server decides and a refusal names the login the Site needs. Writes act as a person: a company API token can read company Sites but can’t create or publish one.
fluid sites publish needs the folder’s binding file, .member-site.json, which names the Site. Don’t edit it or copy it into another Site’s folder. To bind a folder to a new Site, run fluid sites create in it. It creates the Site and writes the binding there, and leaves your files alone:
--company creates a company Site and needs an admin login. A folder already bound to the same Site is left as it is, and a folder bound to another Site is refused. To work on a Site whose source is already saved, clone it with fluid sites pull instead.
Deploy in one step
fluid deploy takes a project folder to a live address:
fluid sites publish’s own code, and prints the address. The first deploy asks once whether the Site is public. --public answers yes, and without a terminal the Site stays private. --no-source and --as work as they do for fluid sites publish.
A Next.js app with a server isn’t a Site. fluid deploy explains why, with Fluid’s recommendation when the server gives one, and creates nothing. See Site or App? and the framework guides.
Check the site
fluid sites lint checks the site’s folder on your machine. It makes no request and needs no login.
fluid sites publish runs before it sends anything:
- Every file of the build has a type a site may serve, such as HTML, CSS, JavaScript, JSON, SVG, images, fonts, text, XML, PDF, MP4, WebM and MP3.
- No file is under
/_fluid/, and nothing in the build is a symbolic link. - The build holds at most 2,000 files, each at most 25 MiB, and 250 MiB in all.
- The build has an
index.htmlwhen there’s noconfig/routes.json, and every route names a file of the build. db/schema.json,config/access.json,config/meta.jsonandconfig/routes.jsonare valid JSON and pass their rules.- There’s no
functions/folder orconfig/functions.json. Server functions aren’t available yet.
0. Any error exits 1.
For a company Site, fluid sites lint also warns when config/meta.json gives no title or description, or the build has no routes and no prerender entry. A warning doesn’t stop a publish, and the title and description warning is fine when the Site’s SEO settings set them. See SEO and indexing.
The build’s folder is dist by default. Name another with --dir, relative to the site’s folder:
Publish
- Hashes every file of the build. A file under
assets/whose name carries a content hash, such asindex-Bx3zQw9a.js, is cached by browsers for a year. - Reads
db/schema.jsonand the files inconfig/. - Runs the checks of
fluid sites lint, and stops before any request when one fails. - Commits the folder and pushes it to the Site’s source repository. See Source in git.
- Uploads only the files the Site doesn’t store yet. Publishing the same build twice uploads nothing the second time, and changing one file uploads one file.
- Publishes: applies the schema, creating the Site’s database on the first publish that has a
db/schema.json, and makes the new build the Site’s current version. It prints the Site’s address.
With
--json, a successful publish prints ok, site, bundle, manifestSha256, source (the repository, branch and commit, or null when the source wasn’t saved) and, when the server sends one, url.
A new Site is private until its owner makes it public. Publish it, open it at its address, and check it before you share it.
To go back to an earlier build, see Deployments and rollback. The operations behind publishing are Start a bundle upload and Publish a bundle, or for a company Site Publish a company site’s bundle.
Make a Site public or private
fluid sites visibility sets who may open the folder’s Site:
public lets anyone open the site, and private only the people it’s shared with. Use the owner’s login: --as member for your own site, --as admin for a company site. Whatever its visibility, a draft or a site a company admin took down opens for nobody, and a site a company admin locked opens only for company admins. The command says so. See Share a Site.
Confirm a destructive schema change
A change todb/schema.json that drops, renames or retypes a table or column, or makes a column required, needs a migration. Confirm each migration by its id, once per migration:
destructive_change_unconfirmed, the command lists each unconfirmed migration with its steps, and nothing changes. See Change the schema.
Finish an interrupted schema change
If a publish leaves a schema change pending, the next publish offers to finish that bundle first. With no terminal, use:--confirm-pending <id> for each of its migrations. Your build’s --confirm values are never applied to the pending bundle. See Finish an interrupted publish.
What the answers mean
When Fluid can’t set up the Site’s source repository, the command says so and publishes without the source. A later publish saves it.
The command never prints the upload addresses it uses.