Skip to content
New: Customize your theme with an AI assistant. Read the guide

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).

SettingValue
Build commandnpm run build
Output directorydist
Node.js version22.12 or later
Package managernpm (package-lock.json)

Before You Launch

Go through this list once. Each item links to the page that explains it.

Address and identity

  • [site] baseUrl is your real address, not the shipped https://example.com placeholder, and npm run build shows no [site] warning (SEO & AI Visibility)
  • title, tagline, description, and logoText in [site], and author and keywords in [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 in theme.css, and fonts in fonts.json are yours (Site Identity & Logo, Colors & Fonts)

Business details

  • [business] in config.toml has your name, business type, phone, email, address (or show = false if 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)
  • zipPattern under [settings.booking] matches your country’s postal codes

Forms

  • contactFormAction and contactFormProvider post to your own account (Formsubmit, Formspree, or Netlify Forms), and the build prints no [forms] warning (Forms)
  • formAction under [settings.booking] is set if booking requests go to a different inbox (Booking Request)
  • The Mailchimp formAction under [settings.subscription] is your list, or enable = false there if you don’t send a newsletter
  • The careers apply address (mailto:[email protected] in src/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)
  • currency under [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 # sample in the content files (Reviews & Projects, Collections)
  • The review links in src/content/sections/english/trust-strip.md (and french/) point to your real review profiles, not https://example.com/review
  • Every sample photo is replaced. IMAGE-CREDITS.md lists them all (Icons & Images)
  • A project-wide search for example.com and 555 finds nothing you still need to change

Pages and menus

  • The privacy policy, terms, cookie policy, and cancellation policy in src/content/pages/english/ and french/ 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": false in 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, and PUBLIC_DEMO_MODE is not set in your host’s environment variables
  • footer.description and footer.copyright in src/i18n/en.json and fr.json describe your business, and the links in src/config/social.json are yours

Analytics and checks

  • Analytics tags are in [head], marked with data-consent while the cookie banner is on (Cookies & Analytics)
  • npm run astro-check and npm run build finish without errors, and you have looked at every page whose section files you changed (astro-check doesn’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

  1. Push your project to GitHub, GitLab, or Bitbucket.
  2. In Netlify, choose Add new site → Import an existing project and pick the repository.
  3. Netlify reads netlify.toml: build command npm run build, publish folder dist, 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.

After You Launch

  1. 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.
  2. Send a test message through the contact form, and a test booking request through all the steps on /book/, and check that both arrive.
  3. Try the estimator on /pricing/ and compare one result with what you would really charge.
  4. Type one of your postal codes into the area finder on /areas/, and one you don’t cover.
  5. Submit https://your-domain/sitemap-index.xml in Google Search Console and Bing Webmaster Tools.
  6. Check the homepage and a service page with Google’s Rich Results Test.
  7. 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:

  1. In config.toml, set indexNowKey under [seo.ai] to a key of 8 to 128 letters, numbers, or dashes that you make up:

    [seo.ai]
    indexNowKey = "a1b2c3d4-your-own-key"
  2. Build and deploy. The build publishes the key file at https://your-domain/<key>.txt, which the search engines check.

  3. After each deploy is live, run from your computer:

    Terminal window
    npm run build
    npm run indexnow # pages changed in the last 7 days
    npm run indexnow -- --all # every page: use it after your first launch

    npm run indexnow -- --dry-run lists 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.

Type something to search...