diff --git a/docs/adding-people.md b/docs/adding-people.md
index b6ab7f0..bf424b4 100644
--- a/docs/adding-people.md
+++ b/docs/adding-people.md
@@ -1,14 +1,8 @@
# Adding New People to the Team Page
-This guide explains how to add new team members to the website. The system is designed to automatically display people based on existing component files.
+This guide explains how to add new team members to the website. The system now features **automated discovery** of people components, so you no longer need to manually update imports!
-## Current System
-
-Currently, only **Adnan Fatayerji** appears on the people page because only his component exists in `src/components/people/People_Adnan.tsx`.
-
-## How to Add a New Person
-
-To add a new team member, follow these steps:
+## ๐ Quick Start (Automated Workflow)
### 1. Create the Person's Component
@@ -71,73 +65,122 @@ export default function JohnDoePage() {
}
```
-### 3. Update the People Data Registry
-
-Add the new person's data import to `src/lib/peopleData.ts`:
-
-```typescript
-// Add import
-import { data as johnData } from '@/components/people/People_John'
-
-// Add to getAllPeopleData function
-export function getAllPeopleData(): PersonData[] {
- const allPeopleData: PersonData[] = []
-
- try {
- allPeopleData.push(...adnanData)
- allPeopleData.push(...johnData) // Add this line
- } catch (error) {
- console.error('Error loading people data:', error)
- }
-
- return allPeopleData
-}
-```
-
-### 4. Add Person's Images
+### 3. Add Person's Images
Add the person's images to: `public/images/people/john_doe/`
- `john_doe.jpg` (or .png, .jpeg)
-## Template System Benefits
+### 4. ๐ Automatic Integration
-The system now uses a **centralized template** (`PersonTemplate.tsx`) for all individual people pages. This means:
+**That's it!** The person will automatically appear on the people page when you build the project. The people data registry is automatically updated during the build process.
+
+If you want to test locally during development, you can manually run:
+```bash
+npm run generate-people-data
+```
+
+## ๐ง How the Automation Works
+
+The system now includes a Node.js script (`scripts/generate-people-data.js`) that:
+
+1. **Scans** the `src/components/people/` directory for all `People_*.tsx` files
+2. **Generates** the necessary imports and exports in `src/lib/peopleData.ts`
+3. **Creates** both synchronous and asynchronous data loading functions
+4. **Eliminates** the need for manual import management
+
+### Available Commands
+
+- `npm run generate-people-data` - Manually regenerate the people data registry (for development testing)
+- `npm run dev` - Start the development server
+- `npm run build` - Build for production (automatically runs people data generation first)
+
+## ๐ File Structure
+
+```
+src/
+โโโ components/people/
+โ โโโ People_Adnan.tsx โ
Auto-discovered
+โ โโโ People_Kristof.tsx โ
Auto-discovered
+โ โโโ People_John.tsx โ
Auto-discovered (after running script)
+โโโ app/people/
+โ โโโ Adnan_Fatayerji/page.tsx
+โ โโโ kristof_de_spiegeleer/page.tsx
+โ โโโ John_Doe/page.tsx
+โโโ lib/
+โ โโโ peopleData.ts ๐ค Auto-generated
+โโโ ...
+```
+
+## ๐ฏ Benefits of the New System
+
+### โ
**No Manual Imports**
+- Add a new `People_*.tsx` file
+- Run `npm run generate-people-data`
+- Done! No need to edit `peopleData.ts` manually
+
+### โ
**Error Prevention**
+- No more forgotten imports
+- No more typos in import statements
+- Automatic error handling for each component
+
+### โ
**Scalable**
+- Add as many people as needed
+- System automatically discovers all components
+- Consistent naming convention enforced
+
+### โ
**Developer Friendly**
+- Clear feedback when running the script
+- Lists all discovered components
+- Easy to debug and maintain
+
+## ๐ Migration from Manual System
+
+If you have existing people components that were manually imported:
+
+1. Ensure all components follow the `People_*.tsx` naming convention
+2. Run `npm run generate-people-data`
+3. The script will automatically discover and include all existing components
+
+## ๐ Naming Conventions
+
+- **Component files**: `People_[FirstName].tsx` (e.g., `People_John.tsx`)
+- **Page directories**: `[First_Last]/page.tsx` (e.g., `John_Doe/page.tsx`)
+- **Image directories**: `first_last/` (e.g., `john_doe/`)
+- **Export function**: `People_[FirstName]` (e.g., `People_John`)
+
+## ๐จ Important Notes
+
+- **Data Structure**: Each person component must export a `data` array with the exact structure shown above
+- **Biography Format**: Use HTML string for rich text formatting in the biography
+- **Template Usage**: All person components should use `PersonTemplate` for consistency
+- **Automatic Discovery**: Components are discovered by filename pattern `People_*.tsx`
+- **Script Execution**: Always run `npm run generate-people-data` after adding new people
+- **URL Structure**: Individual pages will be accessible at `/people/First_Last`
+
+## ๐จ Template System Benefits
+
+The system uses a **centralized template** (`PersonTemplate.tsx`) for all individual people pages:
- **Global Styling**: Change image size, layout, or styling in `PersonTemplate.tsx` and it applies to ALL people's profiles
- **Consistency**: All people pages have the same structure and design
- **Easy Maintenance**: Update the template once instead of editing each person's component individually
- **Responsive Design**: Template handles all responsive breakpoints uniformly
-### Customizing the Template
+## ๐ Current Status
-To change styling for all people pages (like image size), edit `src/components/PersonTemplate.tsx`:
+- โ
**Adnan Fatayerji** - Complete (auto-discovered)
+- โ
**Kristof De Spiegeleer** - Complete (auto-discovered)
+- โ
**Automation System** - Active and ready for new additions
-```typescript
-// Example: To change image aspect ratio for all people
-
-```
+## ๐ฎ Future Enhancements
-## Important Notes
+The automation system can be extended to:
+- Auto-generate page routes
+- Validate image file existence
+- Check for required data fields
+- Generate TypeScript types from component data
+- Create development-time file watchers for instant updates
-- **Data Structure**: Each person component must export a `data` array with the exact structure shown above
-- **Biography Format**: Use HTML string for rich text formatting in the biography
-- **Template Usage**: All person components should use `PersonTemplate` for consistency
-- **Naming Convention**:
- - Component files: `People_[FirstName].tsx`
- - Page directories: `[First_Last]/page.tsx`
- - Image directories: `first_last/`
-- **Automatic Display**: Once all steps are completed, the person will automatically appear on the main people page
-- **URL Structure**: Individual pages will be accessible at `/people/First_Last`
+---
-## Current Status
-
-- โ
Adnan Fatayerji - Complete (component, page, images)
-- โ All other team members - Need to be added following the steps above
-
-The system is designed to be scalable - each new person added will automatically appear on the team page without needing to modify the main PeopleHero component.
+**๐ The new automated system makes adding team members faster, safer, and more maintainable than ever before!**
diff --git a/package.json b/package.json
index e83a230..db6674b 100644
--- a/package.json
+++ b/package.json
@@ -4,9 +4,11 @@
"private": true,
"scripts": {
"dev": "next dev",
- "build": "next build",
+ "build": "npm run generate-people-data && next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "next lint",
+ "generate-people-data": "node scripts/generate-people-data.js",
+ "generate-all-people": "node scripts/generate-all-people.js"
},
"browserslist": "defaults, not ie <= 11",
"dependencies": {
diff --git a/public/images/people/Malte_Geierhos/index.md b/public/images/people/Malte_Geierhos/index.md
new file mode 100644
index 0000000..2b0e453
--- /dev/null
+++ b/public/images/people/Malte_Geierhos/index.md
@@ -0,0 +1,21 @@
+---
+title: Malte Geierhos
+weight: 2
+description: Team Member
+taxonomies:
+ people: [malte_geierhos]
+ memberships: []
+ categories: []
+extra:
+ imgPath: malte_geierhos.jpeg
+ organizations: []
+ countries: []
+ cities: []
+ private: 0
+ socialLinks: {
+ LinkedIn: #,
+ websites: #,
+ }
+---
+
+Malte Geierhos is a valued member of our team, bringing expertise and dedication to their role.
diff --git a/scripts/generate-all-people.js b/scripts/generate-all-people.js
new file mode 100644
index 0000000..42dd1c6
--- /dev/null
+++ b/scripts/generate-all-people.js
@@ -0,0 +1,230 @@
+#!/usr/bin/env node
+
+const fs = require('fs')
+const path = require('path')
+
+// Paths
+const peopleImagesDir = path.join(__dirname, '../public/images/people')
+const peopleComponentsDir = path.join(__dirname, '../src/components/people')
+const peopleAppDir = path.join(__dirname, '../src/app/people')
+
+// Function to parse markdown frontmatter
+function parseFrontmatter(content) {
+ const frontmatterRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/
+ const match = content.match(frontmatterRegex)
+
+ if (!match) return null
+
+ const frontmatter = {}
+ const body = match[2].trim()
+
+ // Parse YAML-like frontmatter
+ const lines = match[1].split('\n')
+ let currentKey = null
+
+ for (const line of lines) {
+ const trimmed = line.trim()
+ if (!trimmed) continue
+
+ if (trimmed.includes(':') && !trimmed.startsWith(' ')) {
+ const [key, ...valueParts] = trimmed.split(':')
+ const value = valueParts.join(':').trim()
+ currentKey = key.trim()
+
+ if (value) {
+ if (value.startsWith('[') && value.endsWith(']')) {
+ // Array value
+ frontmatter[currentKey] = value.slice(1, -1).split(',').map(v => v.trim())
+ } else if (value.startsWith('{') && value.endsWith('}')) {
+ // Object value - parse simple key-value pairs
+ const obj = {}
+ const objContent = value.slice(1, -1)
+ const pairs = objContent.split(',')
+ for (const pair of pairs) {
+ const [k, v] = pair.split(':').map(s => s.trim())
+ if (k && v) {
+ obj[k] = v
+ }
+ }
+ frontmatter[currentKey] = obj
+ } else {
+ frontmatter[currentKey] = value
+ }
+ }
+ }
+ }
+
+ return { frontmatter, body }
+}
+
+// Function to convert name to component name
+function nameToComponentName(name) {
+ return name.replace(/\s+/g, '_').replace(/[^a-zA-Z0-9_]/g, '')
+}
+
+// Function to convert name to function name
+function nameToFunctionName(name) {
+ return 'People_' + nameToComponentName(name)
+}
+
+// Function to generate people component
+function generatePeopleComponent(personData) {
+ const { name, role, imageUrl, linkedinUrl, description } = personData
+ const functionName = nameToFunctionName(name)
+
+ return `import { PersonTemplate } from '@/components/PersonTemplate'
+
+export const data = [
+ {
+ name: '${name}',
+ role: '${role}',
+ imageUrl: '${imageUrl}',
+ xUrl: '#',
+ linkedinUrl: '${linkedinUrl || '#'}',
+ },
+]
+
+const biography = \`
+
+ ${description || `${name} is a valued member of our team, bringing expertise and dedication to their role as ${role}.`} +
+\` + +export function ${functionName}() { + return+ Capable finance specialist with a deep passion in driving lean and innovative business models. +
+` + +export function People_Alexandre_Hannelas() { + return+ +20 years experience leading award-winning banks. AI and technology enthusiast. +
+` + +export function People_Amrit_Gayan() { + return+ Former white house lawyer and private equity fund founder that drives multinational asset recovery solutions. +
+` + +export function People_Chris_Camponovo() { + return+ Experienced social entrepreneur and marketing executive with extensive network in the US and Latam. +
+` + +export function People_Florian_Fournier() { + return+ Social entrepreneur with 20 years of experience building educational content and platforms used by millions today. +
+` + +export function People_Gregory_Flipo() { + return+ Launched leading fintech startups in South America. Regenerating public goods. +
+` + +export function People_Hugo_Mathecowitsch() { + return+ +30 years experience building deep tech. Co-Founder at ThreeFold. +
+` + +export function People_Jan_De_Landtsheer() { + return+ Passionate about driving people-centric strategies with effective KPIs, supporting venture growth and employee satisfaction. +
+` + +export function People_Karoline_Zizka() { + return+ Kristof is a technologist, philosopher, and builder with a long-standing dedication to creating systems that serve the common good. With a background in distributed infrastructure and digital ecosystems, his work is driven by a deep belief in open collaboration, self-sovereignty, and planetary resilience. +
++ At OurWorld, Kristof brings together decades of experience in architecture, code, and community-building to lay the groundwork for ventures that are not only scalable and secureโbut deeply ethical by design. His vision anchors the platform's commitment to aligning technology with life itself. +
+` + +export function People_Kristof_de_Spiegeleer() { + return+ Malte Geierhos is a valued member of our team, bringing expertise and dedication to their role. +
+` + +export function People_Malte_Geierhos() { + return+ Driven by a natural curiosity for new knowledge. OurWorld's mission and values are perfectly aligned with my vision of a better future for all. +
+` + +export function People_Marion_Ravarino() { + return+ CEO Lancor, a global executive search firm specializing in board-level search mandates including C-level execs and more. +
+` + +export function People_Michel_Coucke() { + return+ Advisor to multinationals, funds, family offices and individual entrepreneurs on their strategies and cross border business. +
+` + +export function People_Nousrath_Bhugeloo() { + return+ Former HPE VP Innovation & International Relations. Co-Founder at TF9. +
+` + +export function People_Owen_Kemp() { + return+ Business Developer with experience growing companies across various sectors. +
+` + +export function People_Sacha_Obeegadoo() { + return+ Communication strategist and global citizen, inspired by the beauty of our differences and humbled by our similarities. Driven to drive collective positive change. +
+` + +export function People_Sam_Taggart() { + return+ A Human-centered product manager, researcher and UX Designer who puts the planet as her main mission. +
+` + +export function People_Sasha_Astiadi() { + return+ Software developer who loves nature and believes in using tech to help the planet and people. Believer in open source and collective intelligence. +
+` + +export function People_Timur_Gordon() { + return+ Experienced wealth manager, business developer, and former professional skipper with a wide network in Europe. +
+` + +export function People_Vianney_Spriet() { + return