The public marketing site, a Vue 3 + Vite single-page app that shares the Syncloud brand design system with the platform UI.
cd web
npm install
npm run dev # local dev server
npm run test # vitest (locale key parity)
npm run lint # eslint --fix
npm run build # production build -> web/dist
The site is static — web/dist is what gets deployed.
Locales live in web/src/locales/<code>.json and are lazy-loaded. en.json
is the source of truth; every other locale must have the exact same keys
(the vitest suite enforces this). To add a language:
- Add
{ code, name }toSUPPORTED_LOCALESand a loader entry toAPP_LOCALE_FILESinweb/src/i18n/index.js. - Add
web/src/locales/<code>.jsonwith the same keys asen.json, preserving every{placeholder}verbatim. npm run testto verify key parity, then open a pull request.
CI (.drone.jsonnet) builds the web app and deploys it:
- uat (
test.syncloud.org) on every push. - prod (
syncloud.org) on push to thestablebranch.
Each deploy unpacks web/dist into a versioned directory
/var/www/syncloud.org/<build#>, atomically flips the current symlink,
keeps the last 5 builds, and reloads Apache (see deploy/deploy.sh and
config/<env>/apache.conf). Deploy hosts/keys come from Drone secrets:
uat_deploy_host|user|key|url and prod_deploy_host|user|key|url.