Website — Deployment
Overview
The marketing website has a single production environment. There is no staging or test environment — changes go straight to semalink.africa.
| Property | Value |
|---|---|
| Live URL | semalink.africa |
| CF Pages Project | semalink-website |
| Fallback Domain | semalink-website.pages.dev |
| Deploy trigger | Push to prod branch or manual dispatch |
| Build output | dist/ (static HTML, CSS, JS) |
Branch Strategy
| Branch | Purpose |
|---|---|
main | Development — all PRs and changes merge here first |
prod | Production — merge main into prod to trigger a deploy |
sh
# Deploy to production
git checkout prod
git merge main
git push origin prodCI/CD Workflow
Defined in .github/workflows/deploy.yml. Steps:
- Checkout code
- Setup Node.js 22
- Install dependencies (
npm ci) - Build (
npm run build) — vite-ssg pre-renders all routes to static HTML indist/ - Deploy
dist/to Cloudflare Pages (semalink-websiteproject) - Notify Slack — success (green) or failure (red) with a View Site → button
A full deploy takes approximately 30–45 seconds.
GitHub Secrets
The workflow uses these secrets (set at the repo level, not environment-scoped):
| Secret | Description |
|---|---|
CLOUDFLARE_API_TOKEN | CF API token with Pages write permission |
CLOUDFLARE_ACCOUNT_ID | Cloudflare account ID |
SLACK_WEBHOOK_URL | Slack Incoming Webhook URL |
Manual Deploy
To trigger a deploy without pushing:
- Go to GitHub → Actions → Deploy to Cloudflare Pages
- Click Run workflow
- Select branch → Run workflow
Rollback
- Go to Cloudflare Dashboard → Pages →
semalink-website - Click Deployments tab
- Find the last good deployment → Rollback to this deployment
Rollback is instant — no rebuild required.
No Staging Environment
The website deploys directly to production. Test changes locally with npm run build && npm run preview before merging to prod.