Chenla Agathos Solutions' website source https://chenla-agathos.com
  • TypeScript 82.8%
  • MDX 15.6%
  • JavaScript 1%
  • Shell 0.4%
  • CSS 0.2%
Find a file
2026-06-12 12:36:24 +07:00
app Fix WCAG contrast + add IBM Plex Serif heading face 2026-05-30 22:11:41 +07:00
components Fix WCAG contrast + add IBM Plex Serif heading face 2026-05-30 22:11:41 +07:00
constants Nav: add /framework entry, split from Our Approach, drop Curriculum from menu 2026-05-22 00:34:50 +07:00
content Move A Record of Judgment inline image to standard top position 2026-06-12 12:36:24 +07:00
data Show DC case study: replace low-res hero with high-res exterior shot 2026-05-20 13:54:39 +07:00
docs Code-quality polish from the site audit 2026-05-16 01:19:38 +07:00
lib OG cards phase 4: 10 service sub-pages + portfolio/chenla; jsonLd logo+image cleanup 2026-05-18 15:39:58 +07:00
locales Footer copyright: state actual licences; fix latent Thai i18n (locale field was dead) 2026-05-18 11:57:49 +07:00
public Add cover image to More Work Than Life (Diego Romeo / Unsplash) 2026-06-12 12:32:21 +07:00
scripts Pre-open-repo cleanup: deploy.sh env-driven, next.config.js delocalize, drop internal plans, strip phone EXIF 2026-05-16 18:27:29 +07:00
.env.example Move remaining Formspree endpoints to env vars; add .env.example 2026-05-16 01:02:53 +07:00
.gitignore Move remaining Formspree endpoints to env vars; add .env.example 2026-05-16 01:02:53 +07:00
CHANGELOG.md Scrub [discontinued service] references from CHANGELOG 2026-05-15 20:04:26 +07:00
CLAUDE.md pm2 config: env-var driven (CAS_DEV_*/CAS_PROD_*), trim CLAUDE.md deploy block accordingly 2026-05-16 19:14:52 +07:00
eslint.config.mjs Migrate from next lint to ESLint CLI; remove --no-lint from build 2026-05-16 02:12:01 +07:00
LICENSE Add licences: AGPL-3.0-only for code, CC BY-NC-ND 4.0 for content 2026-05-18 11:02:46 +07:00
LICENSE-CONTENT.md Add Unsplash credit to 10 blog covers; render credit aside on post pages 2026-05-18 12:45:40 +07:00
next.config.js Contact: add MapTiler workshop map and nav links below the form 2026-05-19 16:53:46 +07:00
package-lock.json Contact: add MapTiler workshop map and nav links below the form 2026-05-19 16:53:46 +07:00
package.json Contact: add MapTiler workshop map and nav links below the form 2026-05-19 16:53:46 +07:00
pm2.config.js pm2 config: env-var driven (CAS_DEV_*/CAS_PROD_*), trim CLAUDE.md deploy block accordingly 2026-05-16 19:14:52 +07:00
postcss.config.js Revert Tailwind v4 migration; defer to a planned session with browser tooling 2026-05-17 01:30:11 +07:00
README.md Content licence: CC BY-NC-ND 4.0 -> CC BY-ND 4.0 (match GNU practice for essays) 2026-05-18 11:08:21 +07:00
renovate.json Upgrade TS 5 → 6; README fixes; renovate caps for @types/node v22 + eslint v9 2026-05-16 23:27:42 +07:00
tailwind.config.ts Phase C: delete 39 orphan template files from public/ root, prune unused tailwind bg classes 2026-05-16 03:37:51 +07:00
tsconfig.json Upgrade TS 5 → 6; README fixes; renovate caps for @types/node v22 + eslint v9 2026-05-16 23:27:42 +07:00

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 components
  • components/ — 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 pages
  • docs/ — 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 bundles
  • lib/ — 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.

License

Two licences cover this repository.

  • Code is licensed under the GNU Affero General Public License v3.0. See LICENSE.
  • Content (prose, photographs, brand imagery, blog posts in content/, and copy in public/, docs/, and embedded in route files) is licensed under Creative Commons Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0). See LICENSE-CONTENT.md.

The Chenla Agathos name and logo are not licensed by either notice. All trademark rights are reserved.