Community website for Cursor Saudi — the AI-native developer community in Saudi Arabia.
Live at cursorsaudi.com.
pnpm install # Install dependencies
pnpm dev # Dev server on localhost:4321
pnpm check # TypeScript + Astro diagnostics
pnpm build # Production build → ./dist
pnpm preview # Preview production build locally| Layer | Tech |
|---|---|
| Framework | Astro 5 (static SSG) |
| Styling | Tailwind CSS v4 via @tailwindcss/vite |
| Language | TypeScript (strict) |
| Package mgr | pnpm |
| Deployment | Cloudflare Pages via GitHub Actions |
| Domain | cursorsaudi.com (CNAME in public/) |
- Bilingual: Arabic (RTL, default) and English (LTR) with a client-side toggle stored in
localStorage - Dark mode only: Single dark color scheme, no theme switcher
- Content collections: Events in
src/data/events/with Zod-validated frontmatter - Per-page table of contents: Horizontal pill nav linking to page sections
| Route | Description |
|---|---|
/ |
Home — hero, stats, featured events, partners |
/events |
Full events listing (upcoming + past with recaps) |
/albums |
Photo and video galleries from past events |
/about |
Mission, event types, chapters, team |
/ambassadors |
Cursor ambassador program info and FAQ |
/partnerships |
How to work with Cursor Saudi |
/thankyou |
Speakers, supporters, and community partners |
/blog/[slug] |
Individual event recap posts |
/speakers/[slug] |
Speaker profile pages |
/partners/[slug] |
Partner profile pages |
src/
├── pages/ Routes (index, events, albums, about, …)
├── layouts/Layout.astro Base HTML shell (dark mode, RTL/LTR, meta, canonical)
├── components/ Page components, Header, Footer, PageToc, LangToggle, …
├── config.ts Site metadata, social links, ambassadors, partners
├── content.config.ts Zod schema for events + blog collections
├── data/events/ Event Markdown files (frontmatter-driven)
├── utils/ Helper functions (events, blog, people, validation)
└── styles/global.css Tailwind imports and dark theme CSS variables
public/
├── toggle-lang.js Sets <html dir/lang> from localStorage before paint
├── logos/ Partner logos
├── images/ Static images
└── CNAME cursorsaudi.com
UI copy uses paired <span class="lang-ar"> / <span class="lang-en"> elements toggled via CSS. The public/toggle-lang.js script runs before first paint so the layout direction matches the stored language preference.
- Cursor Saudi ambassadors must be fluent in both Arabic and English. Slides can be in either language, but ambassadors present in Arabic using normal, everyday language.
- Guest speakers can be English-only — international speakers are welcome. Slides can be in either language.
CI runs on every push to main:
pnpm install --frozen-lockfilepnpm check(TypeScript + Astro diagnostics)pnpm buildwrangler pages deploy ./dist
See .github/workflows/deploy.yml for the full workflow.
src/config.tsis the single source of truth for site metadata, social links, ambassadors, and partners- All content collection access goes through utility functions in
src/utils/ - Components are stateless: props in, HTML out, no side effects
Community project by Cursor Saudi.