“I don’t know about you, but I hate checking Surfline every day just to see if there’s something on the horizon.
I’d rather get a notification only when it’s worth paddling out, customized to the kind of surf I actually want. ”
— You, probably 🤙
Surfbot checks Surfline for you and posts only the good surf windows to your Slack channel. You don’t need to know how to code — just follow the steps below and you’ll be up and riding in no time. 🏄
- A Linux computer with Python installed
- A Slack workspace (free account is fine)
- A Surfline spot (your local break)
Download these two files and put them in a folder:
(You’ll get the actual download links from the repo.)
Type this into your terminal:
pip install requests pytz python-dotenv
This installs everything Surfbot needs.
- Go to surfline.com
- Search for your beach
- Click on the surf report
- Look at the link — it’ll look like:
https://www.surfline.com/surf-report/navarre-beach/5842041f4e65fad6a7708b03
Copy that long ID at the end:
5842041f4e65fad6a7708b03
Open the .env
file in a text editor and paste in your info:
SPOT_ID=5842041f4e65fad6a7708b03 # 👈 replace with your ID
SPOT_NAME=Navarre Beach # 👈 just a label for Slack
LOCAL_TZ=US/Central # 👈 your timezone (Google: “pytz timezones”)
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/... # 👈 next step
SLACK_CHANNEL=#surf-reports
SLACK_USERNAME=surfbot
- Go to: Slack Incoming Webhooks
- Choose a channel like
#surf-reports
- Click “Add Incoming Webhook”
- Copy the webhook URL it gives you
- Paste that into your
.env
file where it saysSLACK_WEBHOOK_URL=
Now in your terminal, type:
python3 surfbot.py
If there’s good surf coming, you’ll see a message in Slack like:
🔥 Tue Apr 23, 06:00 AM to 09:00 AM — Fair to Good
🌊 2.5–3.5 ft waves
🌬️ Wind: 4.3 kts @ NW ✅ Offshore
📈 Swell: 7.5 s
🌊 Tide: Rising (0.3ft → 1.0ft) ✅ Ideal
If there’s nothing worth surfing? Surfbot stays quiet. 🤫
Want Surfbot to check for you every morning?
In terminal, type:
crontab -e
Then add this line to check at 6 AM:
0 6 * * * /usr/bin/python3 /path/to/surfbot.py
(Change the path to where you saved the script.)
Surfbot is tuned for Navarre Beach, Florida, which faces south. If your break faces a different direction, use this guide to update the get_wind_label()
function in surfbot.py
.
Surf Break | Facing Dir | ✅ Offshore Winds | ||
---|---|---|---|---|
Navarre Beach, FL | South | N (0°) | S (180°) | E/W (90° / 270°) |
Pipeline, HI | Northwest | SE (135°) | NW (315°) | NE/SW (45° / 225°) |
Ocean Beach, CA | West | E (90°) | W (270°) | N/S (0° / 180°) |
Trestles, CA | South/SW | NE (45°–90°) | SW (210°–240°) | NW/SE (135° / 315°) |
Sebastian Inlet, FL | East | W (270°) | E (90°) | N/S (0° / 180°) |
If your break faces west like Ocean Beach, update your wind logic like this:
def get_wind_label(degrees):
if 60 <= degrees <= 120: # Offshore from east
return "✅ Offshore"
elif 240 <= degrees <= 300: # Onshore from west
return "⚠️ Onshore"
elif (0 <= degrees <= 30) or (150 <= degrees <= 210):
return "↔️ Cross-shore"
return ""
You can adjust these values based on maps, satellite views, or just standing on the sand and feeling where the wind comes from. 🌬️
-
If you see
ModuleNotFoundError
, run:pip install requests pytz python-dotenv
-
If Slack doesn’t post, double-check your webhook URL
-
Still stuck? Open an issue on GitHub and I’ll help out 🤙
That’s it! You’re done. Now go surf 🏄