Skip to content

mikjgens/weatherDash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

weatherDash — Weather Tactical Command

The full weatherDash command center running live: a thermal map of Florida, a global seismic map with an event table, a crypto market tape, an aircraft radar with a fleet readout, world clocks, a red active-alert grid, and a weather broadcast typing out live in the center while a pink flamingo reacts to the sky
The whole command center, live — a weather broadcast on the air while every panel updates around it.

A full-screen terminal dashboard for macOS, styled like a tactical command console from a 1990s ops room. It runs entirely in your terminal and shows a wall of live information at a glance: a thermal map of Florida, weather, earthquakes, weather alerts, the crypto market, aircraft overhead, world clocks, a built-in radio playing original music, an always-on braille sky with a weather-reactive flamingo, and a little newsroom of voices that read the data out loud.

Built on blessed + blessed-contrib, laid out on a custom 12×12 grid. No API keys, no accounts — every feed is free and public.

Why I built this

I'm not a career developer. I've spent my working life on the consulting and marketing-tech side, and this is my first real vibe-coding project — every line of it written with AI, not by hand. I didn't type this code so much as direct it: asking, checking, learning, and asking again, one step at a time.

It actually started with an old iMac that could no longer update to the newest macOS. I didn't want it to go to waste. Stuck on that old OS, about the only thing I could still run was a web-based AI chat in Firefox — so that's where I started, pasting code back and forth. From there I moved into the terminal and started building locally, asking the AI what to copy-paste at each step, slowly standing up the whole workbench myself. Even learning that workflow — what a terminal, a repo, a refactor even were — was brand new to me. Eventually I moved the code over to my regular MacBook to run Claude Code and finish it off — and now I can just mirror it to the TV and nerd out over the dashboard. Life is good.

It's also a love letter to a few things I've always been into. I grew up in the '90s in front of MS-DOS and amber terminals. I've always been quietly obsessed with Bloomberg terminals — that wall of dense, glowing, always-on data. And I have a real soft spot for weather radio broadcasts and the smooth, unbothered music the Weather Channel used to play under the local forecast. I loved that sound so much that I made the soundtrack for this myself (with Suno) — the tracks in music/ are mine, written to score a dashboard exactly like this one.

The build was its own journey. It began as one giant single file, juggled across Qwen and DeepSeek sessions late at night. Somewhere in there I learned what refactoring actually means, broke the monolith into modules, bounced back and forth leveling up, and finally brought it home with Claude Code (Opus 4.8) across the finish line. A lot of this README is me being proud of problems I didn't even know how to describe when I started.

It's freeware. I'd love for people to run it, read it, and learn from it.

What's on screen

  • FL Theater — the centerpiece. A live thermal map of Florida (the whole state drawn as a glowing temperature field), topped with a full Clermont forecast and an hourly strip, with a statewide hot/cool city ranking along the bottom.
  • Live Sky — a tiny always-on braille scene of the Clermont lakeside with a pink flamingo who reacts to the real weather: umbrella in the rain, hunkered down in a storm, leaning into the wind. The sky animates to match conditions and time of day, and the lake keeps rippling.
  • Live broadcast network — a newsroom of five characters who read the real data out loud. No AI writes a word of it — every line is built from the live numbers (see Under the hood). Press a key to put one on air.
  • Seismic activity — global earthquakes from USGS on a world map, with a table of magnitude, depth, region, age, and tsunami flags.
  • FL warning siren — live National Weather Service alerts, with severity-ranked dossiers and countdown timers; when it's all-clear it shows the feed status and what it's watching for.
  • Market watch — live crypto prices for 12 assets across two auto-flipping pages (1h / 24h / 7d change, volume, market cap), with fresh ticks flashing.
  • Aircraft radar — planes overhead from live ADS-B, with a per-aircraft analysis card and a fleet-stats footer (altitude/speed spread, climb/descent counts, origin countries).
  • World clocks + sun cycle — six time zones, plus sunrise, sunset, daylight length, and the current moon phase and illumination (all computed, no API).
  • Secure radio — a Winamp-style player for the original soundtrack: an animated spectrum analyzer, scrolling title, position bar, and live bitrate. Shuffles on launch and loops forever. Drop any audio into music/ and it's picked up automatically.
  • Hourly chime — a town-clock strike and spoken time at the top of every hour.
  • Intel feed — a live log of what the system is doing.

Press A in the app for a built-in MS-DOS-style System Briefing that explains every panel, its data source, and the keys.

A closer look

FL Theater — a live thermal map of Florida

FL Theater: the state of Florida drawn as a glowing orange-to-red temperature field with a vertical temperature legend, a Clermont forecast header, an hourly temperature/rain/cloud strip, and a statewide hot/cool city ranking

The whole state rendered as a temperature field interpolated from ~23 city sensors, topped with the Clermont forecast and an hourly strip, with a statewide hot/cool ranking along the bottom.

Vibe Machine — a radio for the original soundtrack

Radio panel: a purple spectrum analyzer under "PLAYING NOW: Mikel Jorgensen - weatherDash", with MP3 - STEREO, the next track, and playback key hints

An animated spectrum analyzer, scrolling title, position bar and live bitrate. Shuffles on launch and loops forever; drop any audio into music/ and it's picked up automatically.

Every image here is rendered straight from the dashboard's own panels (see scripts/record.js) — these are the real terminal cells, not desktop screenshots.

Under the hood

This is the part I'm proudest of. Almost nothing here is faked or hand-waved — it's a pile of small, deterministic systems that each do one real thing.

  • A real thermal map, drawn in text. Florida's actual coastline (data/florida_geo.json) is projected, aspect-corrected, and scanline-filled into a mask, then every interior pixel is colored by inverse-distance-weighting from ~23 live city temperatures. To get twice the vertical resolution out of a terminal, each character cell carries two independently-colored pixels using half-block glyphs (/) — top color in the foreground, bottom color in the background. See ui/floridaMap.js.
  • The broadcasts are written by math, not AI. The spoken briefs come from a pure data-in / sentences-out "delight engine" (ui/weatherNarrative.js): a dew-point comfort scale, a heat-index "Florida tax," a CAPE storm-fuel gauge, barometer trend, Beaufort wind + Douglas sea state, UV burn-time, daylight delta vs. yesterday, and a pure-math moon phase — all threshold ladders. Two house rules keep it honest: it never says "unknown" (a missing value drops its whole sentence), and every unit is converted deliberately (the source APIs love to sneak metric back in).
  • One newsroom, five characters, one engine. B/I/K/T all feed a single broadcast runner (ui/weatherVoiceModule.js). Lee, the Atlantic-coast anchor, actually reacts — he scores possible comebacks to what the other anchors just said and to the rest of the board (earthquakes, crypto, planes overhead), and leads with the spiciest. A per-press seed rotates the phrasing, so mashing the same key never repeats. Each character's macOS voice is auto-resolved from the installed list, never hard-coded.
  • A flamingo with no random numbers. The scene (ui/weatherSceneModule.js) is a logic tree on the WMO weather code + day/night → a scene (clear, partly, overcast, fog, rain, storm). His pose is a pure function of the frame counter (so it's stable, not jittery), and the braille canvas is multi-hue via a per-pixel layer map even though a terminal cell only has one color.
  • A nervous system. A tiny singleton event bus (core/store.js) — the "signal core" — lets every panel publish its headline so the others can feel the whole board's pulse. It's how Lee knows about the earthquake, and how the sky knows what the weather's doing.
  • A radio that won't quit. True-shuffle queue that reshuffles and loops forever, a spectrum analyzer that's decorative-but-convincing (you can't FFT VLC's output, so it's modeled with per-bar attack/decay), and end-of-track detection by VLC's reported state rather than fragile time math. See ui/radioModule.js.
  • It fixed its own borders. blessed-contrib's grid rounds every panel independently, so docked borders never quite line up — you get doubled seams. A drop-in core/gridLayout.js resolves the 12×12 grid to shared integer gridlines, so neighboring borders land on the same column and merge into clean junctions. Zero seams at any size.

Requirements

This dashboard is macOS-only — it uses built-in Mac tools (afplay, say) for sound and speech.

  • macOS
  • Node.js 18 or newer
  • VLC — only needed for the radio. Install it from the website, or with Homebrew:
    brew install --cask vlc
  • A roomy terminal. It's built to run full-screen and set-and-forget on a big display. It targets 271 × 75 characters but adapts every panel to whatever size your terminal actually is (full-screen on a laptop or mirrored to a TV is typically smaller, e.g. ~213 × 66, and that's fine). Below ~200 × 54 it shows a friendly "enlarge your window" message instead of looking broken.

Running it

# 1. Download the project
git clone https://github.com/mikjgens/weatherDash.git
cd weatherDash

# 2. Install the two libraries it needs (one time)
npm install

# 3. Launch
node app.js

To quit: press q, Esc, or Ctrl-C.

Keys

Key Action
P Play / pause the radio
O Pause the radio
N Next track
R Reshuffle the playlist
B Weather broadcast (Alex → Samantha → Lee); press again to mute / unmute
I Central Florida news broadcast (Walter)
K Market broadcast (Penny)
T Total broadcast — weather, news, and market back to back
C Toggle the hourly chime on / off
A System Briefing — a pop-up explaining every panel, its data source, and the keys (H / ? also open it)
Esc / q / Ctrl-C Exit (while the Briefing is open, Esc closes it instead)

Built to run for days

It's a set-and-forget dashboard meant to live on a spare screen, so it's hardened to keep running without bogging, freezing, or talking over itself:

  • Every feed has a request timeout and backs off (rather than hammering) on errors or rate limits; a feed that fails surfaces its status instead of silently freezing on stale numbers, and a global crash net means one bad frame can never take the app down.
  • Each data panel shows its health with a small pulsing dot — green when the feed is fresh, red when it's gone stale — so you can tell live numbers from frozen ones across the whole board at a glance.
  • The broadcasts and the hourly chime coordinate so they never double up or talk over each other, even if you mash the keys, and the radio ducks cleanly under anyone speaking — voices and bells alike — then always comes back up.
  • Quitting (or just closing the terminal) always shuts the music and voices off, including the startup sound if you exit while it's still playing — nothing keeps running in the background.

Every module is small and self-contained and the code is meant to be read — if you're curious how any of this works, the ui/ and core/ folders are a good place to start.

Data sources

All feeds are free and need no account or API key: USGS (earthquakes), National Weather Service (alerts), Open-Meteo (weather + marine), CoinGecko (market), airplanes.live / adsb.lol (aircraft, community ADS-B — the radar uses both and fails over between them), and Google News (Central Florida headlines).

Built with

100% vibe-coded, start to finish — no line of this was written by hand. It began on a web-based AI chat in Firefox on an old iMac, grew into one big file across Qwen and DeepSeek sessions, got refactored into modules as I learned how, and was brought home with Claude Code (Opus 4.8) across the finish line — asking, checking, and learning the whole way. The only runtime dependencies are blessed and blessed-contrib; everything else (the thermal map, the delight engine, the broadcast network, the flamingo, the radio) was built from scratch for this project.

License

This is freeware — free to use, run, study, modify, and share for any noncommercial purpose. You just can't sell it or use it commercially.

  • Code: PolyForm Noncommercial License 1.0.0 — read it, learn from it, tinker, and share it for free; commercial use and selling are not permitted. © 2026 Mikel Jorgensen.
  • Music: the tracks in music/ are original work by Mikel Jorgensen, © 2026, all rights reserved. They are not covered by the code license — please don't reuse or redistribute them separately.
  • Sound effects: the two bundled SFX (sfx/startup.wav, sfx/alert.wav) are original, procedurally-generated retro sounds — see sfx/README.md. They're covered by the code license; swap in your own anytime (same filenames).

About

A full-screen macOS terminal weather command center — live thermal Florida map, spoken weather/news/market broadcasts, a weather-reactive braille flamingo, and a built-in radio. Vibe-coded, keyless feeds.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors