- TypeScript 84.4%
- MDX 13.9%
- JavaScript 1.1%
- Shell 0.4%
- CSS 0.2%
| app | ||
| components | ||
| constants | ||
| content | ||
| data | ||
| docs | ||
| lib | ||
| locales | ||
| public | ||
| scripts | ||
| .env.example | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| eslint.config.mjs | ||
| next.config.js | ||
| package-lock.json | ||
| package.json | ||
| pm2.config.js | ||
| postcss.config.js | ||
| README.md | ||
| renovate.json | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
Chenla Agathos website
Public website for Chenla Agathos Solutions, a construction project management firm in Cambodia. Internationalised English and Thai.
Stack
- Next.js 15 (App Router)
- React 19
- TypeScript 5
- Tailwind CSS 3
- MDX 3 for blog and content authoring
Layout
app/— routes, layouts, page componentscomponents/— design system primitives (ui/), section composition (sections/,blocks/), and case-study templates (case-studies/)content/— MDX sources for blog posts (CEO, company, PD streams) and project pagesdocs/— internal documentation standards used by the team: blog content guide, case-study standard, service-page standard, system-proof page template, translation glossary. Wiki copies referenced in their headers are the canonical source.public/— static assets (images, downloads, OG cards)locales/— i18n message bundleslib/— shared utilities (JSON-LD generators, related-post matching, MDX helpers)
Develop locally
npm install
npm run dev
Opens at http://localhost:3000.
Build and serve a production build
npm run build
npm start
Serves on port 3001 by default (see package.json).
Deploy
Production and dev clones run on a VPS managed by pm2. Deploys are
driven by scripts/deploy.sh, which pulls, builds into
.next-staging via NEXT_DIST_DIR, swaps .next atomically,
reloads pm2, and rolls back on health-probe failure.
./scripts/deploy.sh dev # deploys to dev (no prompt)
./scripts/deploy.sh prod # deploys to prod (asks to confirm)
./scripts/deploy.sh both # dev first, then prompts for prod
The script reads SSH host alias, target directories, pm2 process
names, and ports from environment variables (CAS_SSH_HOST,
CAS_DEV_DIR, CAS_PROD_DIR, CAS_DEV_PM2, CAS_PROD_PM2,
CAS_DEV_PORT, CAS_PROD_PORT) so operator configuration stays
outside this repo. Defaults are documented in the script header.
Heavy static assets (videos) are served by apache from outside the
repo at /media/... rather than from public/.
Commit conventions
Subject line ≤ 72 characters, imperative mood, no period. Body optional, used when the change has non-obvious root cause or cross-references worth preserving (issue IDs, related plans).
AI collaboration
A portion of commits are authored by a Claude Code agent (visible
in the log as Claude Agent <claude-agent@chenla-agathos.com>).
All work passes through the same human review and push; the split
is roughly 90% human, 10% AI-assisted.