Checks S'PARK Boulder's 2BR availability daily at 9 AM MT and emails grahamzemel@gmail.com whenever anything changes (unit listed, delisted, or rent changes).
git init spark-tracker
cd spark-tracker
# Copy spark_check.py and .github/workflows/check.yml into this folder
git add .
git commit -m "init"
git remote add origin https://github.com/YOUR_USERNAME/spark-tracker.git
git push -u origin main- Go to sendgrid.com → Sign up free (100 emails/day free)
- Go to Settings → API Keys → Create API Key
- Name it
spark-tracker, select Restricted Access → Mail Send → Full Access - Copy the key (you only see it once)
- In SendGrid: Settings → Sender Authentication → Single Sender Verification
- Add any email you own (e.g. a Gmail alias, or your domain email)
- Verify it — this becomes your
FROM_EMAIL
Gmail users: you can use Gmail as a sender if you verify it. Or just use any email you own.
In your repo: Settings → Secrets and variables → Actions → New repository secret
| Secret name | Value |
|---|---|
SENDGRID_API_KEY |
The API key from step 2 |
FROM_EMAIL |
The verified sender email from step 3 |
Go to your repo → Actions tab → enable workflows if prompted.
That's it. The workflow runs every day at 9 AM MT. You can also trigger it manually from the Actions tab.
-
First run: saves a baseline state (
spark_state.jsonin cache). No email. -
Subsequent runs: diffs against baseline. Emails on any change:
- 🟢 New unit listed
- 🔴 Unit taken/removed
- 🟡 Rent changed
- ✨ New floor plan appeared
⚠️ Floor plan removed
-
State is stored in GitHub Actions cache between runs (persists ~7 days of inactivity, resets if no runs)
pip install requests beautifulsoup4 sendgrid
python spark_check.pyWithout SENDGRID_API_KEY set, it just prints to terminal and skips the email.
Edit .github/workflows/check.yml:
- cron: '0 15 * * *' # 9 AM MDT / 8 AM MST daily
- cron: '0 15,21 * * *' # twice daily (9 AM + 3 PM MT)Crontab guru is useful for this.