🌐 Visit our webpage for vision, mission and updates.
🤝 This website is managed by PSF's Diversity and Inclusion Workgroup. If you would like to join as an official member, read more here.
✨ This website welcomes pull requests from anyone in the community.
| Component | Technology |
|---|---|
| Static Site Generator | Pelican |
| Package Manager | uv |
| Templating | Jinja2 |
| CSS Framework | Tailwind CSS (CDN) |
| Icons | Font Awesome 6.4.0 |
uv sync
source .venv/bin/activatepelican contentThis generates the site into the output/ directory.
python -m http.server -d output 8000Then open http://localhost:8000.
pelican --autoreload --listen contentMember data lives in individual JSON files inside the members/ directory. The site automatically reads all .json files from this folder.
Create a new file at members/{firstname-lastname}.json:
{
"name": "Full Name",
"slug": "full-name",
"role": "",
"region": "Asia",
"active": true,
"image": "",
"affiliation": "Company or Organization",
"socials": {
"twitter": "https://twitter.com/username",
"github": "https://github.com/username",
"linkedin": "https://linkedin.com/in/username",
"website": "https://example.com",
"mastodon": ""
},
"bio": "Short optional bio"
}| Field | Description | Example |
|---|---|---|
name |
Full name | "Ada Lovelace" |
slug |
URL-friendly identifier | "ada-lovelace" |
role |
Leadership role (leave empty for regular members) | "Chair", "Co-Chair", "PSF Staff Contact" |
region |
Geographic region | "Asia", "Europe", "Africa", "North America", "South America", "Oceania", "Middle East" |
active |
true for current members, false for past members |
true |
image |
URL to member photo (see below) | "https://..." |
affiliation |
Company, organization, or university | "PSF" |
socials |
Object with social media URLs | See example above |
bio |
Optional short biography | "Pythonista since 2010..." |
Set "active": false in their JSON file. The site automatically moves them to the Past Members section.
Only include links that exist. Empty strings ("") are ignored automatically.
Supported platforms: Twitter/X, GitHub, LinkedIn, personal website, Mastodon.
We follow Pelican conventions for separating theme assets from content images:
| Location | Purpose |
|---|---|
theme/static/images/ |
Theme assets: logos, icons, placeholder images |
content/images/ |
Content images: member photos, hero images, page illustrations |
content/images/
├── members/ # Member portraits
├── hero/ # Hero / banner images
└── pages/ # Page-specific illustrations
When adding a content image, place it in the appropriate subdirectory and reference it by its URL path (e.g., /images/members/jane-doe.jpg).
There are four ways to provide a member photo:
Upload the image somewhere (e.g., GitHub user content, Imgur, your own server) and paste the URL:
{
"image": "https://avatars.githubusercontent.com/u/1234567?v=4"
}If the member has a Gravatar account, use their email hash:
{
"image": "https://www.gravatar.com/avatar/YOUR_MD5_HASH?s=400&d=identicon"
}To use Gravatar, generate the MD5 hash of the email:
echo -n "user@example.com" | md5sumThen construct the URL yourself:
https://www.gravatar.com/avatar/YOUR_MD5_HASH?s=400&d=identicon
Save the image to content/images/members/ and reference it by URL path:
{
"image": "/images/members/firstname-lastname.jpg"
}Leave "image": "" empty. The site falls back to Portrait_Placeholder.png.
Pages are Markdown files in content/pages/.
Create content/pages/my-page.md:
Title: My Page
Slug: my-page
Headline: Page Headline
Subheadline: A short description of this page.
Template: initiative
Your content here. You can use Markdown or embed HTML with Tailwind classes.Update pelicanconf.py or add a link in templates to point to my-page.html.
.
├── content/
│ └── pages/ # Markdown page sources
├── members/ # Individual member JSON files
├── theme/
│ ├── static/
│ │ └── images/ # Static images (logo, etc.)
│ └── templates/ # Jinja2 templates
├── output/ # Generated site (gitignored)
├── pelicanconf.py # Site configuration & data
└── README.md # This file
The site is deployed to GitHub Pages. To deploy:
- Build:
pelican content -s publishconf.py - Push the
output/contents to the GitHub Pages branch.
Ask for help in the Diversity and Inclusion workgroup - Python Software Foundation Slack (thepsf.slack.com) in the #/diversity-and-inclusion channel.