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- For every section enabled via
hide* = falsein[params.cms](programs,catalog,events,guides) — create that section’scontent/{brand}/{section}/_index.{lang}.mdtoo.
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. Cloudflare Turnstile
Add the new production domain to the widget’s hostname list in the Turnstile dashboard.
8. Booking API CORS
If the brand has ecommerce products, add its domain to the CORS allowlist of the CMT Booking API (an Azure App Service), directly on its CORS settings page:
- Develop domain → cmt-booking-develop CORS settings
- Stage and production domain → cmt-booking CORS settings
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.