This file provides context for Claude AI when working with this repository.
This is the MacCoss Lab website at the University of Washington, hosted on GitHub Pages at:
The lab focuses on mass spectrometry-based proteomics research, developing methods and software for protein analysis.
- Static Site Generator: Jekyll with Minima theme
- Hosting: GitHub Pages
- Styling: SCSS (assets/main.scss)
_config.yml # Jekyll configuration
_layouts/ # Custom HTML layouts
_posts/ # News/blog posts (for RSS feed)
assets/
main.scss # Custom styling
images/ # All images (logos, instruments, people, plots)
pages/ # Main site content pages
scripts/
fetch_publications.py # Automated publication fetcher
fetch_skyline_events.py # Automated Skyline events/webinars fetcher
fetch_educational_materials.py # Automated educational materials fetcher
The site has an automated system (scripts/fetch_publications.py) that:
- Fetches Google Scholar metrics (total citations, h-index, most cited paper)
- Fetches ALL publications from PubMed (searches for MacCoss MJ as author)
- Generates a metrics plot (publications/citations per year)
- Regenerates
pages/publications.mdwith year-based navigation sidebar
Publications are displayed with a sidebar showing all years. Clicking a year shows only that year's publications. The layout uses:
.publications-container- flexbox layout with sidebar.year-navigation- sticky sidebar with year buttons.year-content- content divs for each year (only one visible at a time)
- All publications are fetched from PubMed (including preprints)
- This ensures the sidebar counts match the Publications per Year plot
The script must be run manually from a local machine (Google Scholar blocks CI environments).
First-time setup:
python3 -m venv .venv
source .venv/bin/activate
pip install requests beautifulsoup4 matplotlib numpyTo update publications:
source .venv/bin/activate
python3 scripts/fetch_publications.py
git add -A && git commit -m "Update publications" && git pushThe site has an automated system (scripts/fetch_skyline_events.py) that:
- Fetches events from https://skyline.ms/home/software/Skyline/events/project-begin.view
- Fetches webinars from https://skyline.ms/home/software/Skyline/wiki-page.view?name=webinars
- Updates
pages/resources.mdSupport & Training tab with year-based navigation
Past events are displayed with a sidebar showing all years (2013-present). Clicking a year shows only that year's events. The layout uses:
.events-container- flexbox layout with sidebar.event-year-navigation- sticky sidebar with year buttons.event-year-content-area- content divs for each year
To update Skyline events:
source .venv/bin/activate
python3 scripts/fetch_skyline_events.py
git add -A && git commit -m "Update Skyline events" && git pushThe site has an automated system (scripts/fetch_educational_materials.py) that:
- Uses curated Skyline tutorials list (27 tutorials across 6 categories)
- Fetches UWPR online calculators from https://proteomicsresource.washington.edu/protocols06/
- Updates
pages/resources.mdEducational Materials tab
- Skyline tutorials: Hardcoded list (tutorials rarely change, page counts are stable)
- Skyline documentation: https://skyline.ms/home/software/Skyline/wiki-page.view?name=documentation
- UWPR Tips: https://proteomicsresource.washington.edu/protocols05/
- UWPR Tools: https://proteomicsresource.washington.edu/protocols06/
To update educational materials:
source .venv/bin/activate
python3 scripts/fetch_educational_materials.py
git add -A && git commit -m "Update educational materials" && git pushThe site has an automated system (scripts/fetch_datasets.py) that:
- Fetches datasets from Panorama Public API using LabKey query-selectRows API with authentication
- Falls back to curated datasets list if API key is not available
- Updates
pages/resources.mdDatasets tab with year-based organization
The Panorama Public API requires authentication to query across all subfolders. The script looks for an API key in:
PANORAMA_API_KEYenvironment variable.envfile in the project root (format:PANORAMA_API_KEY=your_key_here)~/.panorama_credentialsfile (just the key)
Important: API key files (.env, .panorama_credentials) are in .gitignore to prevent accidental commits.
- Panorama Public: https://panoramaweb.org/project/Panorama%20Public/begin.view
- Filter: Authors containing "MacCoss"
- API endpoint: query-selectRows.api with:
- schemaName=panoramapublic
- query.queryName=experimentannotations
- query.containerFilterName=AllFolders (critical: includes subfolders)
- With API: Datasets organized by year (2025, 2024, etc.)
- Fallback: Datasets organized by category (Instrumentation, Method Development, etc.)
To update datasets:
source .venv/bin/activate
python3 scripts/fetch_datasets.py
git add -A && git commit -m "Update datasets" && git pushPublications are managed automatically via the script. Manual additions should follow this format:
**Paper Title**
Author1, Author2, MacCoss MJ, ...
*Journal Name* Year Month;Volume(Issue):Pages
[PubMed](https://pubmed.ncbi.nlm.nih.gov/PMID/) | [DOI](https://doi.org/...)Create files in _posts/ with format YYYY-MM-DD-title.md:
---
layout: post
title: "Post Title"
date: YYYY-MM-DD
categories: [category1, category2]
---
Post content here...assets/images/logos/- Software and lab logosassets/images/instruments/- Mass spectrometer photosassets/images/people/- Lab member headshotsassets/images/publication-metrics.png- Auto-generated plot
source .venv/bin/activate
python3 scripts/fetch_publications.py
git add -A && git commit -m "Update publications" && git pushsource .venv/bin/activate
python3 scripts/fetch_skyline_events.py
git add -A && git commit -m "Update Skyline events" && git pushsource .venv/bin/activate
python3 scripts/fetch_educational_materials.py
git add -A && git commit -m "Update educational materials" && git pushsource .venv/bin/activate
python3 scripts/fetch_datasets.py
git add -A && git commit -m "Update datasets" && git pushbundle exec jekyll servegrep -i "biorxiv\|arxiv\|corrigendum" pages/publications.mdPython packages required:
requests- HTTP requestsbeautifulsoup4- HTML parsing for Google Scholarmatplotlib- Plot generationnumpy- Numerical support
-
Google Scholar scraping: May occasionally fail if Google blocks requests. The script handles this gracefully and continues with other updates.
-
PubMed API: Uses NCBI E-utilities (no API key required for low-volume requests).
-
Publication metrics format: Numbers should NOT have
>or+symbols since they're updated weekly. -
Tab navigation: Multiple pages use JavaScript-based tabs (Resources, People, Funding).
-
Email obfuscation: All emails use
[at]and[dot]format to reduce spam.
- PI: Michael MacCoss
- Institution: University of Washington, Department of Genome Sciences
- Research focus: Quantitative proteomics, mass spectrometry methods, Skyline software development
- Key software: Skyline, Panorama, Encyclopedia, Limelight
- Test locally with
bundle exec jekyll servewhen possible - Check for broken image paths after moving files
- Maintain consistent formatting in publication entries
- Ensure new images are optimized for web
- Run the publication script to verify it still works after changes