This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is a Hugo-based static website for EMERGENT (EMory bactERial GEnomics aNd meTagenomics), a research group at Emory University. The site uses the Ananke theme and is automatically deployed to GitHub Pages via GitHub Actions.
Group member profiles use a two-file system:
-
JSON data file (
data/group/${firstname}-${lastname}.json): Contains structured metadata- Display name, position, weight (for sorting)
- Social links (github, google_scholar, ncbi_bibliography, orcid, twitter, bluesky, website)
- Template available at
data/group/template.json
-
Markdown content file (
content/group/${firstname}-${lastname}.md): Contains biographical text- YAML frontmatter with author and date
- Biography content in markdown
-
Image file (
static/images/group/${firstname}-${lastname}.jpgor.png): Profile photo
The Hugo templates automatically link these together using the ${firstname}-${lastname} slug.
The site uses a multi-function shortcode system via layouts/shortcodes/group.html:
{{< group "group_picture" "/images/path.jpg" "Caption text" >}}- Display group photos with captions{{< group "current_members" >}}- Auto-generates grid of current members fromdata/group/*.json, sorted byweightfield
- Main group listing at
/group/renders fromcontent/group.mdusinglayouts/group/list.html - Individual member pages at
/group/${firstname}-${lastname}/render usinglayouts/group/single.htmlwhich includeslayouts/partials/group-partial.html - The partial reads BOTH the JSON data file AND the markdown content file to create the complete profile
- Member photos are looked up in order:
.jpg→.png→blank.pngfallback
Share buttons are implemented in two locations:
layouts/partials/share-buttons-for-posts.html- Blog post sharinglayouts/partials/site-footer.html- Site-wide footer sharing
Both use custom SVG icons and the static/css/share-button.css for styling.
Local development:
hugo server # Run local dev server with live reloadBuild:
hugo --minify # Generate static site in public/ directoryDeployment: Automatic via GitHub Actions on push to master branch. See .github/workflows/ for configuration. Uses Hugo version 0.79.1 (extended).
- Create JSON file:
data/group/${firstname}-${lastname}.json(usetemplate.jsonas base)- Set
weightfield to control display order (lower numbers appear first) - Add social links including new
blueskyfield if applicable
- Set
- Create markdown file:
content/group/${firstname}-${lastname}.md - Add profile image:
static/images/group/${firstname}-${lastname}.jpgor.png
Main group photo and historical photos are managed in content/group.md. Images should be placed in static/images/ with naming convention Group-YYYY-MM-DD.jpg or Group-YYYY.jpg.
Configured in config.toml under [[menu.main]] sections. Social icons in header controlled by [params] section (twitter, facebook, github, etc.). Empty string values hide the icon.
The News section provides short updates and announcements with automatic RSS feed generation.
- Create a new markdown file in
content/news/with naming convention:YYYY-MM-DD-title.md - Include YAML frontmatter with title, date, and draft status:
--- title: "Your News Title" date: 2026-01-08 draft: false ---
- Add your news content in markdown format below the frontmatter
RSS Feed: Automatically available at /news/index.xml
News posts appear in reverse chronological order on the /news/ page.
Publication cross-listing rule: When a news item mentions a new publication, always look up the full citation (all authors, journal, year, DOI) and add it to the "Recent Publications" section in content/research.md under the appropriate year heading. Create a new year heading if needed. Use the same citation format as existing entries.
PubMed update rule: Any time the news section is updated (new post added or existing post edited), search PubMed for recent publications by lab members and update the "Recent Publications" section in content/research.md with any new entries not already listed. Use the NCBI E-utilities API (e.g., https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=Read+TM[Author]&retmax=10&sort=date) or search PubMed directly to find new publications. Add any missing entries under the appropriate year heading using the same citation format as existing entries.
People linking rule: When mentioning a person by name in a news item, link their name if possible:
- Current members (those with a file in
content/group/): link to/group/${firstname}-${lastname}/ - Former members (listed in
content/group.mdunder "### Former Members"): link to their external profile (see Former Members linking rule below), or fall back to/group/if no profile is found
Former Members linking rule: When adding or updating a former member entry in content/group.md, search for their profile in this priority order — stop as soon as one is found:
- ORCID (search
site:orcid.org "Firstname Lastname") - Google Scholar (search
site:scholar.google.com "Firstname Lastname") - GitHub
- Personal or lab webpage
Only link if confident the profile belongs to the correct person. If none found, leave the name unlinked. Apply this rule when adding any new former member and when updating existing entries.
Typo checking rule: After creating or substantially editing any text content (blog posts, news items, group member bios), proofread the text for typos and grammatical errors. Fix clear errors silently. For scientific/technical terms (species names, strain IDs, kit names, numerical measurements, software tool names), flag them to the user for verification rather than correcting them. Report all fixes made and all terms flagged in a single summary.
All filenames must be lowercase kebab-case (hyphens only, no underscores, no mixed case). File extensions must be lowercase (.jpg not .JPG, .png not .PNG).
New content rule: Any new content must follow this schema. When adding any file, verify it conforms before saving.
| Type | Pattern | Example |
|---|---|---|
| News post | content/news/YYYY-MM-DD-kebab-slug.md |
2026-04-02-tim-read-senior-editor.md |
| Blog post | content/blog/posts/YYYY-MM-DD-kebab-slug.md |
2024-02-09-alex-bog-mrsa-hyperglycemic.md |
| Group member markdown | content/group/firstname-lastname.md |
tim-read.md |
| Group member JSON | data/group/firstname-lastname.json |
tim-read.json |
| Type | Path | Example |
|---|---|---|
| Blog post images | static/images/posts/YYYY-MM-DD-post-slug/description.png |
posts/2024-02-09-alex-bog-mrsa-hyperglycemic/fig-1-tree.png |
| News images (if needed) | static/images/news/YYYY-MM-DD-news-slug/description.png |
news/2026-04-02-senior-editor/photo.jpg |
| Group member photo | static/images/group/firstname-lastname.jpg |
group/tim-read.jpg |
| Group photo | static/images/group/group-YYYY-MM-DD.jpg |
group/group-2025-12-01.jpg |
| Lab Pictures gallery image | static/images/group/group-YYYY-MM-DD.jpg (same location as group photos) |
group/group-2025-12-01.jpg |
Image naming within subdirectories: Use fig-N-description.png for paper/data figures, image-N.jpg for generic photos. Keep names short and descriptive.
content/lab-pictures.md is a gallery of group photos and other images not attached to a specific blog/news post. It uses the {{< gallery-image "/images/..." "caption" >}} shortcode and the layouts/labpictures/single.html layout.
Lab Pictures rule: Any image that is not the current group photo on the Group page and is not directly linked to a blog post or news item should be added to content/lab-pictures.md using the gallery-image shortcode. Keep entries ordered newest first (by the date the photo was taken). When a group photo is replaced as the current photo on the Group page, add the old photo to content/lab-pictures.md.
config.toml- Site configuration, navigation menu, social links, theme settingscontent/group.md- Group page content (current group photo, member grid, former members)content/lab-pictures.md- Gallery of group photos and other images, newest firstcontent/news/_index.md- News section landing pagelayouts/labpictures/single.html- Lab Pictures page layout (2-column flex grid)layouts/partials/group-partial.html- Individual member profile display logiclayouts/shortcodes/group.html- Multi-function shortcode for group photos and member gridslayouts/shortcodes/gallery-image.html- Shortcode for Lab Pictures gallery entriesstatic/css/share-button.css- Social sharing button styles (includes custom bluesky styling)