Deployment & Launch
Kivo builds a static site into dist/, so it runs on any static host. It ships ready-made settings for Netlify, Vercel, and Cloudflare Pages.
| Setting | Value |
|---|---|
| Build command | npm run build |
| Output directory | dist |
| Node.js version | 22.12.0 or later |
| Package manager | npm (package-lock.json) |
Before You Launch
Go through this list once. Each item links to the page that explains it.
-
[site] baseUrlis your real address, not the shippedhttps://example.complaceholder, andnpm run buildshows no[site]warning (SEO & AI Visibility) - Site name, logo, favicon, and colors are yours (Quick Start)
- The contact form and the newsletter post to your own accounts (Forms)
- The log-in and sign-up screens post to your app (
form.actioninsrc/content/auth/), or are deleted -
docsUrlpoints to your documentation, and[settings.contactInfo]has your phone, email, and address -
[settings.layoutSwitcher] enable = false(the default), andPUBLIC_DEMO_MODEis not set in your host’s environment variables - The Pages demo menu is hidden, and no menu link points to
#(Menus) - Demo pages you don’t need are deleted, for example the demo homepages,
/components/,/elements/, and/status/if you don’t run a status page (Pages) - Demo content is replaced: features, customers, team, careers, blog, changelog, integrations, testimonials. The sample job roles are deleted or replaced with real openings (Collections)
- The privacy policy, terms, and cookie policy are reviewed for your business, and their placeholder notices removed
- Social links in
src/config/social.jsonare yours - Analytics scripts are in
[head], gated on consent if the cookie banner is on (Cookies & Analytics) -
npm run astro-checkandnpm run buildfinish without errors, and you have looked at the section, contact, FAQ, and pricing pages you changed (astro-checkdoesn’t check those files)
Deploy
- Push your project to GitHub, GitLab, or Bitbucket.
- In Netlify, choose Add new site → Import an existing project and pick the repository.
- Netlify reads
netlify.toml: build commandnpm run build, publish folderdist, Node.js 22. Click Deploy.
The build uses baseUrl from config.toml unless you add a SITE_URL environment variable in the Netlify site settings.
netlify.toml also sets long-term caching for /_astro/* and /images/*, and sends missing /fr/... URLs to the French 404 page. Add a block for each extra language.
Using Netlify Forms? Set contactFormProvider = "netlify" and contactFormAction = "/", enable form detection under Forms, and redeploy.
- Push your project to GitHub, GitLab, or Bitbucket.
- In Vercel, choose Add New → Project and import the repository. Framework preset: Astro.
- Vercel reads
vercel.json, which builds withsh vercel.sh. Click Deploy.
vercel.sh sets the site address (SITE_URL) for each build, and on Vercel it replaces baseUrl:
- Production builds use the
SITE_URLenvironment variable if you set one in the Vercel project settings. Otherwise they use your Vercel production domain. SetSITE_URL(for examplehttps://www.acme.dev) when you want one exact address, such as thewwwor the bare domain. - Preview builds use
https://staging.<your production domain>.
Edit vercel.sh if you want something else.
vercel.json also enables trailing slashes, redirects /sitemap.xml to /sitemap-index.xml, and serves the .md and llms files as text.
From git: in the Cloudflare dashboard, open Workers & Pages → Create → Pages → Connect to Git, pick the repository, and set the build command to npm run build and the output directory to dist (the same folder as pages_build_output_dir in wrangler.toml).
The included wrangler.toml already sets NODE_VERSION = "22.13.1" under [vars]. Cloudflare treats this file as the source of truth for the settings in it and shows them read-only in the dashboard, so change them in the file. Set your address with baseUrl in config.toml.
From your computer: Kivo doesn’t install Wrangler (Cloudflare’s command-line tool) for you. Add it once, change name in wrangler.toml to your project name, then log in, build, and deploy:
npm install -D wranglernpx wrangler loginnpm run buildnpm run deploy:cfpublic/_headers serves the .md and llms files as text on Cloudflare Pages and Netlify.
Run npm run build and upload the contents of dist/ to your web server or static host (GitHub Pages, S3, a shared host, and so on).
For Apache servers, public/.htaccess (copied into dist/) sets browser caching for CSS, JavaScript, images, and fonts, and serves the .md copies as Markdown with X-Robots-Tag: noindex.
After You Launch
- Open the live site and click through the main pages, in light and dark mode, on a phone.
- Send a test message through the contact form, and sign up for the newsletter once.
- Test search (⌘K or Ctrl+K).
- Submit
https://your-domain/sitemap-index.xmlin Google Search Console and Bing Webmaster Tools. - Optional: set
[seo.ai] indexNowKey, deploy, and runnpm run indexnow -- --all. After later deploys, runnpm run indexnow. - Share a link in a chat app to check the preview image.
Updating The Live Site
With a git-connected host, every push to your main branch deploys automatically. Build locally first (npm run build) to catch errors before they reach your visitors.