Command-line surf report tool
Project description
cli-surf is a real-time ocean data and surf forecasting tool for the command line.
- Live wave height, swell direction, period, UV index, wind, and more
- Forecasts up to 7 days out
- Use as a CLI tool (
surf) or query via HTTP API / browser - Optional GPT-powered surf reports
- Supports metric and imperial units, custom colors, and JSON output
Inspired by wttr.in ยท Documentation ยท Discord
Table of Contents
๐ป Usage
There are two ways to use cli-surf: install it as a CLI tool via pipx, or run the server and access it via API/browser.
Installing via pipx (pypi)
brew install pipx
pipx install cli-surf
surf --help
surf --location scripps_pier --forecast 4
Running the server and using via API
Start the server locally (see Setup below), then query it from your browser or CLI:
$ curl localhost:8000
Location: San Diego
.-``'.
.` .`
_.-' '._
UV index: 6.4
Wave Height: 3.9
Wave Direction: 238.0
Wave Period: 9.8
API Examples
Arguments are separated by commas.
curl localhost:8000
curl localhost:8000?location=new_york,hide_height,hide_wave,show_large_wave
curl localhost:8000?fc=3,hdate,loc=trestles,c=light_blue
curl localhost:8000?show_past_uv,show_height_history,show_direction_history,show_period_history
curl localhost:8000?loc=malibu,gpt,color=yellow
curl localhost:8000?loc=nazare,json
For the full argument reference, see below or run:
curl localhost:8000/help
API Arguments
Display
| Argument | Shorthand | Description |
|---|---|---|
location |
loc |
Location for the forecast. Ex: loc=new_york_city or loc=nyc |
hide_wave |
hw |
Hide the default wave art |
show_large_wave |
slw |
Show the large wave art |
color |
c |
Color of wave art. Ex: color=light_blue |
hide_location |
hl |
Hide location name |
hide_date |
hdate |
Hide date in forecast |
metric |
m |
Use metric units (default: imperial) |
decimal |
dec |
Specify decimal places in output |
json |
j |
Output data as JSON. Must be the only argument |
Surf Conditions
| Argument | Shorthand | Description |
|---|---|---|
hide_height |
hh |
Hide wave height |
hide_direction |
hdir |
Hide swell direction |
hide_period |
hp |
Hide swell period |
hide_uv |
huv |
Hide UV index |
show_air_temp |
sat |
Show air temperature |
show_wind_speed |
sws |
Show wind speed |
show_wind_direction |
swd |
Show wind direction |
show_rain_sum |
srs |
Show rain sum |
show_precipitation_prob |
spp |
Show max precipitation chance |
show_cloud_cover |
scc |
Show hourly cloud cover |
show_visibility |
sv |
Show hourly visibility |
Historical Data
| Argument | Shorthand | Description |
|---|---|---|
show_past_uv |
spuv |
Show past UV index |
hide_past_uv |
โ | Hide past UV index |
show_height_history |
shh |
Show past wave height |
hide_height_history |
โ | Hide past wave height |
show_direction_history |
sdh |
Show past wave direction |
hide_direction_history |
โ | Hide past wave direction |
show_period_history |
sph |
Show past wave period |
hide_period_history |
โ | Hide past wave period |
GPT
| Argument | Shorthand | Description |
|---|---|---|
gpt |
g |
Activate GPT surf report. Customize via GPT_PROMPT in .env. Default: off |
๐ ๏ธ Setup
How to Start Locally with Poetry
-
Install Poetry.
-
Clone the repository.
git clone https://github.com/ryansurf/cli-surf.git cd cli-surf
-
Install dependencies and activate the virtual environment.
make install -
Start the server.
poetry run python src/server.py # Or via Makefile make run
How to Start with Docker
-
Install Docker and Docker Compose.
-
Clone the repository.
git clone https://github.com/ryansurf/cli-surf.git cd cli-surf
-
Start the container.
docker compose up -d # Or via Makefile make run_docker
Variables
When running locally with Poetry, create a .env file from the example:
cp .env.example .env
When starting with Docker, the .env file is created automatically from .env.example during the image build.
General
| Variable | Description |
|---|---|
PORT |
Port to run the application on. Default: 8000 |
IP_ADDRESS |
IP address the server runs on. Default: localhost |
Email (optional โ see Email Server)
| Variable | Description |
|---|---|
SMTP_SERVER |
Email server. Default: smtp.gmail.com |
SMTP_PORT |
Email server port. Default: 587 |
EMAIL |
Address to send the report from |
EMAIL_PW |
Sending email's password |
EMAIL_RECEIVER |
Address to receive the report |
COMMAND |
Command shown in the email. Default: localhost:8000 |
SUBJECT |
Email subject line. Default: Surf Report |
GPT (optional โ see GPT Surf Report)
| Variable | Description |
|---|---|
GPT_PROMPT |
Prompt sent to the model along with surf data. Ex: With this data, recommend what size board I should ride. |
API_KEY |
OpenAI API key. Create one here |
GPT_MODEL |
OpenAI model to use. Default: gpt-3.5-turbo (recommended: gpt-4o). See all models here |
Database (optional โ see MongoDB)
| Variable | Description |
|---|---|
DB_URI |
MongoDB connection URI |
Email Server
Optional โ sends a surf report to a specified email on a schedule.
You'll need an email account with SMTP access. Gmail works; follow Method #1 here, then update the email variables in .env.
Note: The FastAPI server must be running to send emails.
# Send email locally (Poetry)
make send_email
# Send email via Docker
make send_email_docker
MongoDB
Optional โ stores all request output in a MongoDB database.
See the MongoDB get started guide for setup, then set DB_URI in your .env.
Frontend
Note: The frontend is no longer maintained
Although this application was made with the CLI in mind, a frontend exists.
Streamlit Frontend
streamlit run src/dev_streamlit.py
# Available at http://localhost:8502
HTML/JS/CSS Frontend (legacy, no longer actively developed)
Available at http://localhost:8000/home or <ip_of_host>:<port>/home.
You may need to set IP_ADDRESS in .env to match the host's IP.
๐ง GPT Surf Report
cli-surf can generate personalized surf reports using OpenAI's GPT models.
Setup
-
Get an OpenAI API key at platform.openai.com. Make sure a payment method is added.
-
Update
.env:API_KEY=your_openai_api_key_here GPT_MODEL=gpt-3.5-turbo # gpt-4o recommended for better results GPT_PROMPT=With this data, recommend what size board I should ride and nearby surf spots that may be better with the given conditions.
-
Use the
gptargument:curl localhost:8000?location=Malibu,gpt
Customizing the prompt
Change GPT_PROMPT in .env to get different types of reports:
GPT_PROMPT="Analyze the surf conditions and suggest the best time of day to surf."
GPT_PROMPT="What are some good places to eat around this surf spot?"
Notes
- A payment method is required โ OpenAI will reject requests from free accounts.
- GPT responses consume tokens based on prompt and response size.
- Response time may be slower than standard output, especially during OpenAI outages.
gpt-4ogives better results thangpt-3.5-turbobut costs more.
๐ง Tech Stack
| Layer | Technology |
|---|---|
| Language | Python 3.10+ |
| Web framework | FastAPI + Uvicorn |
| CLI | Click |
| Weather data | Open-Meteo API |
| Optional AI | OpenAI GPT API |
| Optional database | MongoDB (pymongo) |
| Optional frontend | Streamlit |
| Packaging | Poetry, pipx |
| Containerization | Docker / Docker Compose |
๐ Contributing
Thank you for considering contributing to cli-surf!
See CONTRIBUTING.md to get started.
Questions? Comments?
โจ Contributors
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cli_surf-2.2.1.tar.gz.
File metadata
- Download URL: cli_surf-2.2.1.tar.gz
- Upload date:
- Size: 29.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4740d9923986c794b6e55efa731d968ac78146719a45d9d4963dd9e63dee0b0d
|
|
| MD5 |
f96d017f1e1fa315dc95e56299b87e7c
|
|
| BLAKE2b-256 |
ec83b6a322fba5fa6ad29482361e29af80480ece289f35735d78b4a119129895
|
Provenance
The following attestation bundles were made for cli_surf-2.2.1.tar.gz:
Publisher:
publish.yml on ryansurf/cli-surf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cli_surf-2.2.1.tar.gz -
Subject digest:
4740d9923986c794b6e55efa731d968ac78146719a45d9d4963dd9e63dee0b0d - Sigstore transparency entry: 1258554572
- Sigstore integration time:
-
Permalink:
ryansurf/cli-surf@cba67f1c81bbe911ce6b32050b9ba4ce2383fdcb -
Branch / Tag:
refs/tags/v2.2.1 - Owner: https://github.com/ryansurf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cba67f1c81bbe911ce6b32050b9ba4ce2383fdcb -
Trigger Event:
release
-
Statement type:
File details
Details for the file cli_surf-2.2.1-py3-none-any.whl.
File metadata
- Download URL: cli_surf-2.2.1-py3-none-any.whl
- Upload date:
- Size: 28.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4723beee535be79d2d513f823cd78299ac0071074ac7c5f1b8d92cea80a10a23
|
|
| MD5 |
d376efdc3dce32d131cb000ebeba0e15
|
|
| BLAKE2b-256 |
fada37af4872db3dab91230cb8fee7360aa94e7f36241c479a75350f4eaa1513
|
Provenance
The following attestation bundles were made for cli_surf-2.2.1-py3-none-any.whl:
Publisher:
publish.yml on ryansurf/cli-surf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cli_surf-2.2.1-py3-none-any.whl -
Subject digest:
4723beee535be79d2d513f823cd78299ac0071074ac7c5f1b8d92cea80a10a23 - Sigstore transparency entry: 1258554638
- Sigstore integration time:
-
Permalink:
ryansurf/cli-surf@cba67f1c81bbe911ce6b32050b9ba4ce2383fdcb -
Branch / Tag:
refs/tags/v2.2.1 - Owner: https://github.com/ryansurf
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cba67f1c81bbe911ce6b32050b9ba4ce2383fdcb -
Trigger Event:
release
-
Statement type: