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.
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.
- 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.
FL Theater — a live thermal map of Florida
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
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.
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. Seeui/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/Tall 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-incore/gridLayout.jsresolves 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.
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.
# 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.jsTo quit: press q, Esc, or Ctrl-C.
| 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) |
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.
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).
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.
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 — seesfx/README.md. They're covered by the code license; swap in your own anytime (same filenames).

