A Node.js service that posts a morning briefing to a Vestaboard on a daily schedule. Each morning it fetches current weather conditions and tide predictions and displays them as a formatted 6×22 character grid.
MONDAY JUNE 22ND
PARTLY CLOUDY 72°/58°
RISE 5:12AM SET 8:34PM
HIGH LOW
10:23AM 3:45PM
4:12PM 9:58PM
Weather is sourced from Open-Meteo (free, no API key required). Tides are sourced from the NOAA Tides & Currents API (free, no API key required).
- Node.js v22+
- A Vestaboard Read/Write API token (Vestaboard app → Settings → Developer)
-
Clone and install dependencies:
git clone <your-repo-url> cd vestabot-scheduler npm install
-
Copy
.env.exampleto.envand fill in your token:cp .env.example .env
Variable Required Description VESTABOARD_TOKENYes Vestaboard app → Settings → Developer → Read/Write API token TIDE_STATIONNo NOAA station ID for tides (default: 8444762— Cohasset Harbor)LATITUDENo Weather location latitude (default: 42.2456— Cohasset Harbor)LONGITUDENo Weather location longitude (default: -70.8043— Cohasset Harbor)TIMEZONENo Timezone for cron scheduling (default: America/New_York)MORNING_CRONNo Cron expression for morning briefing (default: 30 6 * * *— 6:30 AM daily)To find your NOAA station ID, search at tidesandcurrents.noaa.gov.
node index.jsYou should see:
⏰ Vestabot (Scheduler) is running — morning briefing at cron "30 6 * * *" (America/New_York)
The process stays alive and fires the briefing at the scheduled time each day.
Pass --now to trigger the briefing immediately on startup. The process still stays alive and fires again on its normal schedule, so it's safe to use with a long-running container too.
node index.js --nowIn Docker, pass it as a command override:
# Fire immediately and exit (one-shot test)
docker run --rm --env-file .env vestabot-scheduler node index.js --now
# Fire immediately, then keep running on schedule
docker run -d --restart unless-stopped --env-file .env --name vestabot-scheduler vestabot-scheduler node index.js --nowBuild:
docker build -t vestabot-scheduler .Run:
docker run -d --restart unless-stopped --env-file .env --name vestabot-scheduler vestabot-schedulerRebuild after changes:
docker build -t vestabot-scheduler . && docker rm -f vestabot-scheduler && docker run -d --restart unless-stopped --env-file .env --name vestabot-scheduler vestabot-schedulerUseful commands:
docker logs vestabot-scheduler # view logs
docker restart vestabot-scheduler
docker stop vestabot-scheduler