This repository contains the source code for the personal academic and professional portfolio of B. L. Alterman, a research astrophysicist. The website is built as a static site using Next.js and is hosted on GitHub Pages. It is designed to be a clean, professional, and easily maintainable platform to showcase research, publications, and professional experience.
A key feature of this project is its set of automated data workflows, which use GitHub Actions to periodically fetch and process data, ensuring the content remains up-to-date with minimal manual intervention.
The website relies on a series of GitHub Actions to automate content updates. Here is a breakdown of the key workflows found in the .github/workflows/ directory:
update-site-data.yml: Runs every Monday at 01:23 UTC as a single job. It fetches citation metrics and the publication list from the NASA ADS API (via ORCID), merges invited talks, generates publication statistics, derives year-by-year citation counts fromads_metrics.json, and regenerates the publication, h-index, and citation timeline plots, committing everything as one[automated]commit.deploy.yaml: Builds the Next.js static export (output: 'export'innext.config.ts) and publishes it to GitHub Pages. It runs after a successfulupdate-site-data.ymlorconvert-pdfs.yml, every Monday at 08:23 UTC, or on manual dispatch.audit-deployed-data.yml: Runs every Monday at 12:23 UTC and checks the live site's data against the repository.convert-pdfs.yml: Triggers on a push that updates theresearch-corpussubmodule. It converts each paper'sfig_*.pdffigures to SVG underpublic/papers/<paper_id>/figures/, falling back to PNG for very large figures.
Deployment: Pushing to main does not deploy by itself. Changes go live after the next data update or the Monday 08:23 UTC scheduled deploy, or immediately with gh workflow run deploy.yaml --ref main.
The site is built with Next.js using the App Router, which allows for a statically generated website (output: 'export') that is fast, secure, and ideal for hosting on GitHub Pages. All data used to build the site is consolidated in the /public/data directory, which serves as the single source of truth.
Below is a breakdown of the key data files and their role in the content pipeline.
ads_publications.json:- Origin: Auto-generated weekly by the
update-site-data.ymlworkflow. - Purpose: Contains the comprehensive list of all publications from NASA ADS.
- Usage: Consumed by the Publications Page (
src/app/publications/page.tsx) to build the various publication tables. It is also a key input for thegenerate_figure_data.pyscript.
- Origin: Auto-generated weekly by the
ads_metrics.json:- Origin: Auto-generated weekly by the
update-site-data.ymlworkflow. - Purpose: Contains key citation statistics (h-index, total citations, etc.).
- Usage: Consumed by the Publications Page to display the summary metric cards.
- Origin: Auto-generated weekly by the
citations_by_year.json:- Origin: Derived weekly from
ads_metrics.jsonbyscripts/derive_citations_by_year.py, run by theupdate-site-data.ymlworkflow. - Purpose: Contains yearly citation counts.
- Usage: Used by its corresponding script to generate the plot at
public/plots/citations_by_year.svg.
- Origin: Derived weekly from
research-topics/*.json(per-topic files):- Origin: Manually curated.
- Purpose: Each file defines a research topic with title, description, primary figure reference, related figure references, related topics, and paper citation metadata.
- Usage: Consumed by the Research Pages (
src/app/research/[slug]/page.tsx) to generate topic subpages. Figure references are resolved against the figure registry at build time.
figure-registry.json:- Origin: Generated by
scripts/generate_figure_registry_from_corpus.pyfrom research-corpus metadata. - Purpose: Central registry of all figures with rich metadata (summaries, keywords, usage tracking across topics).
- Usage: Consumed by research topic pages and figure detail pages (
src/app/research/figure/[paper_id]/[figure_id]/page.tsx).
- Origin: Generated by
education.json&positions.json:- Origin: Manually curated.
- Purpose: Contain structured data about academic degrees and professional history.
- Usage: Consumed by the Experience Page (
src/app/experience/page.tsx) to populate the education and professional position cards.
To run the website locally, follow these steps:
-
Install Dependencies:
npm install
-
Run the Development Server:
npm run dev
This will start the Next.js development server, typically on http://localhost:9002.