A static GitHub Pages dashboard for tracking public Meetup events across selected London tech groups.
The browser app does not scrape Meetup directly. Instead:
scripts/scrape-meetup.jsruns in GitHub Actions or locally.- It fetches public
/events/pages and public event pages. - It writes
data/events.json. index.html+app.jsload that local JSON file and render the dashboard.
This avoids browser CORS issues and means GitHub Pages can host the app without a live Node server.
The scraper reads the watched groups from groups.yml:
groups:
- https://www.meetup.com/london-devops/
- https://www.meetup.com/devsecops-london-gathering/Add or remove one public Meetup group URL per line.
npm run scrape
npm run build
npm run servenpm run serve hosts the rebuilt public/ artifact.
Then open:
http://localhost:8080
- Push this folder to a GitHub repository.
- In GitHub, go to Settings → Pages.
- Set the Pages source to GitHub Actions.
- Go to Actions → Update Meetup Events → Run workflow to generate the first
data/events.json. - The scheduled workflow then refreshes the JSON and deploys the rebuilt static site every 12 hours.
.github/workflows/update-events.yml runs:
npm run scrape
npm run buildIt writes data/events.json, builds a fresh public/ artifact containing the static frontend and updated JSON, commits data/events.json back to the repository if it changed, and deploys the artifact to GitHub Pages.
Environment variables supported by the scraper:
| Variable | Default | Purpose |
|---|---|---|
DAYS_AHEAD |
90 |
Only include events within this many days |
MAX_EVENT_PAGES_PER_GROUP |
30 |
Limit event page fetches per group |
GROUPS_PATH |
groups.yml |
YAML file containing watched Meetup group URLs |
REQUEST_DELAY_MS |
1500 |
Delay between requests |
REQUEST_TIMEOUT_MS |
25000 |
HTTP timeout per request |
USER_AGENT |
built-in | User-Agent header for requests |
- This only uses public Meetup pages.
- It does not use Meetup OAuth or Meetup Pro API access.
- It does not collect attendee emails, member details, private comments, or private group data.
- Meetup can change its frontend markup, so the scraper may need occasional maintenance.
- Keep request volume low and respectful.
meetup-event-radar/
├── index.html
├── styles.css
├── app.js
├── data/
│ └── events.json
├── scripts/
│ ├── build-static.js
│ ├── groups-config.js
│ └── scrape-meetup.js
├── .github/
│ └── workflows/
│ └── update-events.yml
├── groups.yml
├── .gitignore
├── .nojekyll
├── package-lock.json
├── package.json
└── README.md