This repository is a configurable Next.js template for Cursor Ambassador community sites.
pnpm install
pnpm run devOpen http://localhost:3000.
app/page.tsx: homepage composition (hero, featured, events, ambassadors, partners, world events).app/recaps/[slug]/page.tsx: dynamic recap page route.app/slides/[id]/page.tsx: optional workshop slides route.
components/HeroHeader.tsx: top section + bento photo grid.components/FeaturedSection.tsx: featured resource card.components/UpcomingEvents.tsxandcomponents/PastEvents.tsx: event lists.components/AmbassadorSection.tsx: ambassador cards.components/Partners.tsx: hosting partner cards/logos.components/WorldEventsCarousel.tsx: global event photos.
This template is content-first. Most customization is done by editing files in content/.
content/site.config.ts: global site settings (community name, city/country, URLs, locales, footer text).content/header-photos.ts: hero bento images (src,alt,span,mobileHidden).content/featured.ts: featured card text + CTA.content/events.ts: upcoming/past events and recap links.content/ambassadors.ts: ambassador data and social links.content/partners.ts: host/sponsor logos and URLs.content/world-events.ts: world carousel entries.content/recaps/*.ts: recap documents rendered by slug.content/locales/*.json: translation dictionaries.content/locales/index.ts: locale bundle registry consumed bylib/i18n.tsx.
Edit content/site.config.ts:
communityName,communityNameLocal,city,countrylumaUrl,cursorCommunityUrldefaultLocale,localesfooterTagline
Edit content/header-photos.ts.
Each entry uses explicit grid coordinates (1-indexed) for deterministic placement on a 4-column x 4-row grid:
src: image path/URLalt: accessibility textrow,col: starting row and column (required)rowSpan,colSpan: how many rows/columns the tile occupies (default 1)mobile: optional{ row, col, rowSpan?, colSpan? }override for the 2-column mobile gridmobileHidden: optional boolean to hide on small screens
Use local assets in public/images/ for portability.
Edit content/events.ts.
status: 'upcoming' | 'past'controls which list renders the event.lumaUrlis used for registration links.recapPathconnects a past event to a recap route (for example/recaps/example-event).thumbnailis shown in past event cards.
To add a recap:
- Add a recap file in
content/recaps/. - Ensure the recap exports a valid recap object with a matching
slug. - Add
recapPathin the corresponding event.
Slides are optional and live in modules/slides/.
- Data source:
modules/slides/content/example-deck.tsx - Route:
app/slides/[id]/page.tsx
If your community does not use slides, remove links to /slides/* from content.
content/ambassadors.ts:name, optionalrole,photo, and links (x,linkedin,github,website).content/partners.ts: partnername,logo,url, optionallogoBg, optionallogoHeight.
Local SVG logos in public/images/partners/ are recommended.
Edit content/world-events.ts entries (src, location, date, alt).
components/WorldEventsCarousel.tsx renders this list directly.
- Runtime provider:
lib/i18n.tsx - Dictionaries:
content/locales/*.json - Bundle registry:
content/locales/index.ts - Config gate:
siteConfig.locales
Language toggle appears when siteConfig.locales.length > 1.
- Create
content/locales/xx.json(for exampleth.json). - Register it in
content/locales/index.ts. - Add
'xx'tositeConfig.locales. - Optionally set
defaultLocaleto'xx'.
Example content/locales/index.ts:
import en from './en.json';
import th from './th.json';
export const localeBundles = {
en,
th,
} as const;Use t('path.to.key', params) from useI18n().
- Dot-path keys:
t('home.upcomingEvents') - Parameter replacement:
t('home.attendees', { count: '42' })for strings like"{count} attendees"
If a key is missing, the function returns the key path (useful for spotting missing translations).
Homepage order is defined in app/page.tsx.
- Remove a section by deleting the component from the page.
- Add a section by creating a component and inserting it in
app/page.tsx.
Keep content source files aligned with any component changes.
This template currently uses local images in public/images/ for:
- hero event photos
- world events photos
- ambassadors
- partner logos
With fully local images, next.config.js does not need remote image domains.
- Push to GitHub.
- Import repository in Vercel.
- Deploy with default Next.js settings.
Build command:
pnpm run buildStart command:
pnpm run startSee CONTRIBUTING.md.
- cursorthailand.com
- cursorserbia.com
- cursorcroatia.com
- cursorsrilanka.com
- cursoraustria.com
- cursorgermany.com
- cursorslc.com
- cursorelsalvador.com
Using this template? Open a PR to add your site here.
Designed and implemented by Luis Fernando Romero Calero and Cursor.
MIT. See LICENSE.
