From arXiv to argument — every week.
Live site: https://meighenbergers.github.io/jc-ppi/
A minimal static website for a high-energy physics journal club. Members submit paper suggestions via a Google Form; submissions appear on the site automatically, bucketed by week, with full metadata fetched live from INSPIRE-HEP. No manual curation required.
Member fills out Google Form
↓
Response appends to private Google Sheet (includes email)
↓
Apps Script checks email → ticks Approved if known member
↓
Public sheet tab mirrors all columns except email
↓
Site fetches Public tab as CSV → shows only approved, non-removed rows
↓
INSPIRE-HEP API fills in title, authors, abstract, citations, BibTeX
Papers submitted during the current Monday–Sunday window appear on the This Week page. After Sunday they roll automatically into the Archive — no manual action required.
A second pipeline keeps the Trending Papers section on the home page up to date:
Apps Script triggers on Monday and Wednesday morning
↓
refreshTrendingPapers() queries INSPIRE-HEP for top-cited hep-ph papers
↓
Results written to the Trending tab in the Google Sheet
↓
Site fetches Trending tab as CSV → renders dedicated Trending section on home page
↓
weeklySlackReminder reads the same Trending tab (no live API calls needed)
| Feature | Details |
|---|---|
| Auto metadata | Title, authors, abstract, citation count fetched from INSPIRE-HEP |
| BibTeX copy | One-click copy of the INSPIRE BibTeX entry |
| arXiv validation | Invalid IDs shown in red; IDs not yet on INSPIRE shown in amber |
| ID auto-correction | Three-digit-prefix IDs (e.g. 708.1137) are automatically tried as 0708.1137 |
| Subfield filter | Archive can be filtered by broad HEP category (Pheno, Theory, Experiment, …) |
| Year selector | Stats page can be scoped to a specific year |
| This-week voting | Visitors can upvote papers on the current week's list |
| Inline editing | Submitters (or anyone) can update the suggestion comment for this week's papers |
| Remove entry | Entries can be removed from the live list (this week only, with confirmation) |
| Calendar export | One-click .ics download for the next meeting |
| Meeting info | Slack link, time, student guide, and calendar button on the home page |
| Trending papers | Top-cited recent hep-ph papers from INSPIRE-HEP shown in a dedicated home-page section; refreshed automatically on Monday & Wednesday |
For members in the approved list: submit a paper via the form — it appears on the site automatically (the Apps Script ticks Approved instantly).
For anyone not yet in the list: their submission is held until you open the private Google Sheet and manually tick the Approved checkbox in column F for that row. Changes appear on the site within about a minute.
To add a recurring member permanently, add their email address (one per row) to the Members tab of your Google Sheet. No code changes are needed.
Any static file server works:
python -m http.server 8000 --directory site
# open http://localhost:8000Note: fetching the Google Sheets CSV is blocked by CORS in some browsers during local development. Push to GitHub Pages to test the live data flow end-to-end.
The JavaScript logic (week math, CSV parser, arXiv ID helpers, INSPIRE metadata parsing) has a built-in test suite using Node's node:test module — no external dependencies required.
npm install # first time only (sets up the pre-commit hook)
npm testThe pre-commit hook runs the test suite automatically before every commit, so broken code cannot be merged accidentally. See docs/CONTRIBUTING.md for details.
site/ ← everything GitHub Pages serves
index.html ← This Week page
archive.html ← Past submissions grouped by week
stats.html ← Submission statistics by year
resources.html ← arXiv & INSPIRE-HEP guide for members
assets/
css/style.css ← All styling
js/
config.js ← ✏️ Your Google URLs live here
utils.js ← Week math, CSV parser, arXiv ID helpers
inspire.js ← INSPIRE-HEP API client + arXiv validation
sheet.js ← Apps Script mutation wrapper (vote/edit/remove)
table.js ← DOM table builder
app.js ← Page renderers and entry point
trending.js ← Trending papers section renderer
docs/
SETUP.md ← Full deployment guide for your own instance
CONTRIBUTING.md ← How to suggest a paper / contribute to the site
INTERACTIVITY.md ← Vote / edit / remove feature and Apps Script setup
ARXIV-GUIDE.md ← Guide to arXiv and INSPIRE-HEP for members
appscript.gs ← Paste into Google Apps Script (both scripts)
.githooks/
pre-commit ← Prettier format + npm test
.github/workflows/
deploy-pages.yml ← Deploys to GitHub Pages on site-file changes
check-links.yml ← Monthly check that URLs are still reachable
tests/
utils.test.js ← Week math, CSV, arXiv ID validator tests
data.test.js ← Deduplication and stats tests
inspire.test.js ← INSPIRE parseHit tests
runner.html ← Browser-side DOM tests for buildTable
fixtures/ ← CSV and JSON test fixtures
package.json ← Test runner config (node:test, no external deps)
| Limitation | Detail |
|---|---|
| Sheets CSV propagation delay | Google's "Publish to web" CSV endpoint is cached on Google's side and can lag 1–5 minutes behind the actual sheet data. Actions that write to the sheet via the Apps Script (votes, edits, the discussed ★ toggle) take effect in the sheet instantly but may not be reflected in the CSV on the next page load. The site works around this for the ★ flag by storing the user's last-known discussed state in localStorage for 10 minutes, so the star badge survives a reload while the CSV catches up. Other mutations (votes, comment edits) are rendered optimistically in the DOM without waiting for the CSV to sync. |
| Document | Contents |
|---|---|
| docs/SETUP.md | One-time setup: Google Sheet, Form, Apps Script, GitHub Pages |
| docs/INTERACTIVITY.md | Vote / edit / remove feature, Apps Script doPost, date guard |
| docs/CONTRIBUTING.md | Suggesting a paper; contributing code; test guide |
| docs/ARXIV-GUIDE.md | Member guide to arXiv IDs and INSPIRE-HEP |
| CODE_OF_CONDUCT.md | Contributor Covenant |