Deployment & Launch
Homio builds a static site into dist/, so it runs on any static host. It ships ready-made settings for Netlify (netlify.toml), Vercel (vercel.json, vercel.sh), and Cloudflare Pages (wrangler.toml).
| Setting | Value |
|---|---|
| Build command | npm run build |
| Output directory | dist |
| Node.js version | 22.12 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.
Address and identity
-
[site] baseUrlis your real address, not the shippedhttps://example.complaceholder, andnpm run buildshows no[site]warning (SEO & AI Visibility) -
title,tagline,description, andlogoTextin[site], andauthorandkeywordsin[seo], describe your business. The tagline is added to every page title (Config Reference) - The logo, favicons (
npm run generate-favicons), social image (npm run generate-og-image, after the two items above), colors intheme.css, and fonts infonts.jsonare yours (Site Identity & Logo, Colors & Fonts)
Business details
-
[business]inconfig.tomlhas your name, business type, phone, email, address (orshow = falseif you have no public address), opening hours, time zone, and closed dates, and the build prints no[business]warning (Business Info) - The sample service areas in
src/content/areas/are replaced with yours, with real postal codes, and the area links in the Pages menu point to them (Service Areas) -
zipPatternunder[settings.booking]matches your country’s postal codes
Forms
-
contactFormActionandcontactFormProviderpost to your own account (Formsubmit, Formspree, or Netlify Forms), and the build prints no[forms]warning (Forms) -
formActionunder[settings.booking]is set if booking requests go to a different inbox (Booking Request) - The Mailchimp
formActionunder[settings.subscription]is your list, orenable = falsethere if you don’t send a newsletter - The careers apply address (
mailto:[email protected]insrc/content/careers/english/-index.md) is yours, or the sample roles are removed
Prices and sample content
- Every price, frequency discount, add-on, and estimator rate in
src/content/pricing/is yours, with the same numbers in English and French (no[pricing]warning) (Pricing & Estimator) -
currencyunder[settings.estimator]is yours - The services and their included lists match what your crews really do (Services & What’s Included)
- Sample facts are replaced: reviews and ratings, insurance amounts, team members, projects, job roles, blog posts, and the Re-clean guarantee terms. They are marked
# samplein the content files (Reviews & Projects, Collections) - The review links in
src/content/sections/english/trust-strip.md(andfrench/) point to your real review profiles, nothttps://example.com/review - Every sample photo is replaced.
IMAGE-CREDITS.mdlists them all (Icons & Images) - A project-wide search for
example.comand555finds nothing you still need to change
Pages and menus
- The privacy policy, terms, cookie policy, and cancellation policy in
src/content/pages/english/andfrench/are rewritten for your business and reviewed. They ship as sample text with a notice at the top - The Pages demo menu is hidden (
"enable": falsein both menu files), and the menus point at your pages (Menus) - The demo homepages you don’t use are deleted (Homepages), and
/elements/and/components/are removed if you don’t want the layout and shortcode galleries online (Pages) -
[settings.layoutSwitcher] enable = false, andPUBLIC_DEMO_MODEis not set in your host’s environment variables -
footer.descriptionandfooter.copyrightinsrc/i18n/en.jsonandfr.jsondescribe your business, and the links insrc/config/social.jsonare yours
Analytics and checks
- Analytics tags are in
[head], marked withdata-consentwhile the cookie banner is on (Cookies & Analytics) -
npm run astro-checkandnpm run buildfinish without errors, and you have looked at every page whose section files you changed (astro-checkdoesn’t check section files or the contact page file) - You checked the site at phone width, in dark mode, and in French if you kept it
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 in the Netlify dashboard, and redeploy. Booking requests use the same provider.
- 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.your-domain.com) 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 turns on trailing slashes, redirects /sitemap.xml to /sitemap-index.xml, and serves the .md copies (marked noindex) and the 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 sets NODE_VERSION = "22.13.1" under [vars], a version Homio supports. 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: Homio doesn’t install Wrangler (Cloudflare’s command-line tool) for you. Add it once, change name in wrangler.toml (shipped as homio-astro) to your project name, then log in, build, and deploy:
npm install -D wranglernpx wrangler loginnpm run buildnpm run deploy:cfRun 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).
Ask your host how to serve .md files as text/markdown and llms.txt as text/plain, if you keep [seo.ai] markdownPages and llmsTxt on. Without that, some browsers download those files instead of showing them.
After You Launch
- Open the live site and click through the main pages, on a computer and on a phone, including the mobile menu, the Call button, and dark mode.
- Send a test message through the contact form, and a test booking request through all the steps on
/book/, and check that both arrive. - Try the estimator on
/pricing/and compare one result with what you would really charge. - Type one of your postal codes into the area finder on
/areas/, and one you don’t cover. - Submit
https://your-domain/sitemap-index.xmlin Google Search Console and Bing Webmaster Tools. - Check the homepage and a service page with Google’s Rich Results Test.
- Share a link in a chat app to check the preview image.
Tell Search Engines About Changes With IndexNow
IndexNow tells Bing, Yandex, Seznam, and Naver which pages changed, so they visit them sooner. Bing also feeds ChatGPT search and Copilot. It is off until you set a key:
-
In
config.toml, setindexNowKeyunder[seo.ai]to a key of 8 to 128 letters, numbers, or dashes that you make up:[seo.ai]indexNowKey = "a1b2c3d4-your-own-key" -
Build and deploy. The build publishes the key file at
https://your-domain/<key>.txt, which the search engines check. -
After each deploy is live, run from your computer:
Terminal window npm run buildnpm run indexnow # pages changed in the last 7 daysnpm run indexnow -- --all # every page: use it after your first launchnpm run indexnow -- --dry-runlists the pages without sending them.
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.