Website for the International Baccalaureate (MYP & DP) at Súkromné Gymnázium Česká in Bratislava, Slovakia. Built with Astro in hybrid mode: pages are statically prerendered, and a Cloudflare Worker backs the Keystatic CMS admin routes.
- Subject listings + detail pages: IB groups 1–6 with HL/SL levels, rendered syllabi, and teacher info
- CAS journal: Creativity, Activity, Service entries with learning outcomes and reflection pages
- TOK materials: Theory of Knowledge essays and themes, with full essay pages
- Extended Essay: timeline, resources, and document downloads
- News: exam schedules, announcements, events, with an RSS feed at
/rss.xml - Programme pages: dedicated MYP (
/myp) and DP (/dp) curriculum overviews - Admissions: application steps, programme guidance, and direct school contact at
/admissions - IB team: verified programme leadership, subject teachers, coordinators, and support staff at
/teachers - Bilingual: English primary, full Slovak UI + optional Slovak content (English fallback)
- SEO: complete bilingual sitemap, canonical +
hreflang, social cards, and schema.org structured data - CMS: content edited visually through Keystatic at
/keystatic/, no code required
pnpm install
pnpm run dev # → localhost:4321 (CMS admin at /keystatic/)| Command | Action |
|---|---|
pnpm run dev |
Dev server at localhost:4321 (incl. /keystatic/) |
pnpm run build |
Cloudflare Workers production build |
pnpm run preview |
Build and preview in the Workers runtime |
pnpm run deploy |
Build and deploy with Wrangler |
pnpm run check |
Type-check the project (astro check) |
- Astro 7: hybrid mode (static prerender + Cloudflare Workers runtime for CMS routes)
- Tailwind CSS 4: utility-first, CSS-based config (no
tailwind.config.js) - Keystatic CMS: visual editor + Reader API. Content stored as
.mdocfiles - MDX (
@astrojs/mdx): for.astrocomponents that use JSX - TypeScript: strict mode via
astro/tsconfigs/strict - Node 22.12.0 or newer
Content is not managed with Astro content collections. It is managed by Keystatic:
- Schemas live in
keystatic.config.ts(Keystaticfields.*API, not Zod). - Entries are
.mdocfiles (YAML frontmatter + Markdoc body) undersrc/content/. - Pages read content through the Reader API singleton in
src/lib/keystatic.ts.
| Collection | Path | Description |
|---|---|---|
subjects |
src/content/subjects/ |
IB subject offerings |
news |
src/content/news/ |
Announcements & updates |
cas |
src/content/cas/ |
CAS activity logs |
tok |
src/content/tok/ |
TOK essays & materials |
Editors should use the CMS at /keystatic/ rather than touching .mdoc files by hand. See humans/CONTENT.md.
- URL:
/keystatic/athttp://localhost:4321/keystatic/in dev,https://ib.gymnaziumceska.sk/keystatic/in production. - Dev (
kind: 'local'): writes.mdocfiles straight to disk, no login. - Production (
kind: 'github'): saves are commits authored via GitHub OAuth, so only people with write access to theVSHT3/ib-ceskarepo can save. GitHub repo membership is the access list. - Production OAuth uses the
IB Ceska CMSGitHub App and three host secrets. Seehumans/DEPLOY.md.
- Primary: English for all UI, content, and commit messages.
- Secondary: Slovak, full UI translation shipped. Content can be translated per-entry with English fallback.
- Do not write Czech in code or content.
See humans/ for onboarding, the content-editing guide, design decisions, and the original handover brief. New developers should also read the root AGENTS.md.
Production targets Cloudflare Workers with static assets. Current @astrojs/cloudflare versions do not support Pages SSR, so create a Worker rather than a Pages project.
pnpm run build
npx wrangler deployUse main as the production branch so code pushes and Keystatic content commits trigger the same production pipeline. Full dashboard, secrets, verification and DNS instructions are in humans/DEPLOY.md.
Private. Súkromné Gymnázium Česká.