Creating a New Site
To create a new site, follow these steps:
Client defines these:
- Site name
- Logo, favicon
- Theme primitives (base colors, typography choices, border radius)
- Content structure (which collections it has - events, catalog, programs, guides)
- domain name
- list of languages and the default language
- define which footer to use
Developer Setup Steps
1. Decap Turbo
- Log in to Decap Turbo dashboard
- Add new site with project name:
cmt-{brand} - Get the Turbo Site ID from dashboard
- Add the ID to
config/{brand}/hugo.toml’s[params.cms]block, alongside thehide*feature flags for this brand (hideEcommerce/hideCatalog/hideEvents/hideGuides):This is read directly by[params.cms] turboSiteId = "your-turbo-site-id-here" hideEcommerce = false hideCatalog = false hideEvents = false hideGuides = falselayouts/admin/list.cmsConfig.ymlwhen it renders/admin/config.yml— there’s no separate CMS config file to create. The CMS’s locale list is derived automatically from this samehugo.toml’s[languages.*]block, so it doesn’t need to be set here too.
2. Configuration Files
Add brand to deployment:
.github/workflows/deploy.yml- Add toBRANDSenv var. Add new brands on the CMT Cloudflare account withoutcmt-prefix on the Pages project name (e.g.fit-retreat,gud-plesi) — add the brand to thecasestatements in the “Select Cloudflare account and project name” step, and to the matchingcaseinbin/build.sh’sset_site_url(). Brands still namedcmt-{brand}haven’t been migrated to the CMT account yetREADME.md- Add URLs and commandsbin/site-config.mjs- Add the brand name toBRAND_NAMES(this is what validatesSITE=forbin/dev.js/bin/build.shand whatbin/prompt-site.mjs’s menu lists)
Hugo config:
config/{brand}/hugo.toml- Site config with params (including[params.cms], see above), a[languages.*]block, social links, module mountsconfig/{brand}/menus.json- Navigation structure (main, cta, relatedbrands)
Form submission recipients:
- Create
functions/form-recipients/{brand}.json:{ "default": ["recipient@example.com"], "forms": [] } - Register it in
functions/form-recipients.js(import + add toFORM_RECIPIENTS_BY_BRAND). Form names on this brand must start with{brand}-so they’re matched correctly.
3. Brand Styling
File: assets/{brand}/styles/_brand-theme.scss
Define CSS variables for:
- Brand colors (primary, secondary with 100/120 variants)
- Accented colors (text, surfaces, borders)
- Font families (display, heading, title, body, label, supporting, button)
- Font weights for each family
4. Content & Data Files
Content:
content/{brand}/_index.{lang}.md- Homepage for each language
Data files in data/{brand}/:
footer.json- Footer links, social media, contact infofaqTabs.json- Add adefaulttab entry (e.g.{"key": "default", "label": "Splošno"}) so the help center page has a tab for FAQ groups to fall back to — without it, groups/FAQs won’t render on the help center page
5. Static Assets
Directory: static/{brand}/
favicon.png- Site favicon
6. Cloudflare Deployment
- Create Pages project:
{brand}(sites that are namedcmt-{brand}haven’t been migrated to the CMT Cloudflare account yet — see step 2 above) - Connect to GitHub repository
- Add required environment variables:
HUGO_VERSION(e.g.,0.154.5)NODE_VERSION(e.g.,20)BREVO_API_KEYandBREVO_SENDER_EMAIL- needed for forms to send email- …
- Disable automatic deployments - we use GitHub Actions for builds instead
7. Booking API CORS
If the brand has ecommerce products, add its domain to the CORS allowlist on cmt-booking in Azure:
- Develop domain →
cmt-booking-develop - Stage and production domain →
cmt-booking
Timeline
The deadline for creating a new site is 5 working days since the client provides all necessary inputs defined above. The client must inform the contractor 2 weeks in advance about the intention to create a new site.