HomeBuildFilmTravelPlay
Hank Leukart
Product Manager by day. Filmmaker by night.
Hank Leukart

NOW
Bluesky →

my fyp just won't be the same without sydney towle's spirit, empathy, and grit. the big green lost a real one.

5 days AGOBluesky →

My film Echoes of the Escalante is officially headed to the Chagrin Documentary Film Festival! Screening dates are Oct 9 and 10. See you in Ohio!

41 days AGOBluesky →

the moment i get my delorean, i'll travel to 2011 montreal because of mile end kicks

55 days AGOBluesky →

but that’s not how domino’s is spelled

58 days AGOBluesky →

proof that great car ads can actually work: no one buys green cars except for almost every rivian owner

65 days AGOBluesky →

i just realized playing with a baby is just ucb because you just find the game and you’re good to go

e-ink
Glanceable from across the room. No backlight, no screen glare, just a permanent weather verdict on your wall.
8 verdicts
Not just yes/no—Beach Day, Night Time, Indoor Day, Rain Day, Wind Day, Brrr Day, Nice Day, and Grey Day.
hourly
Parses Open-Meteo hourly forecast data to predict exactly when the fog will burn off.
tomorrow
Automatically switches to tomorrow's forecast after sunset so you can plan ahead.
What It Does

<strong>A Weather Decision Engine for Your Wall</strong>

Beach Day is an e-ink dashboard that answers one question: should you go to the beach today? It pulls live forecast, UV, and air quality data from Open-Meteo, runs it through a stack of opinionated comfort rules, and renders a verdict you can read from across the room.

<strong>Eight Verdicts, Not Two</strong>

Most weather apps dump numbers on you and make you do the math. Beach Day distills the entire forecast into one of eight states, each with its own icon and subtitle. "Beach Day! Pack the car." Or "Wind Day. Hold your towel." Or "Indoor Day. Air Purifier On Max." Or on a foggy 68° morning with sun in the afternoon: "Nice Day. But not quite beachy." The worst case isn't a wall of data. It's "Grey Day. Seattle vibes."

<strong>Fog-Clearing Prediction (with a 2 PM Cutoff)</strong>

Beach Day parses every hour of the forecast between 9 AM and 6 PM, finds the first hour where the sky clears (WMO codes 0 or 1), and tells you exactly when: "At 11 AM." If the day starts sunny, it says "All day." If there's no sun at all, "Cloudy."
To qualify for a Beach or Nice Day, the clearing must happen by 2:00 PM or earlier. If the sun doesn't come out until 3:00 PM, the day is flagged as a "Grey Day." However, the checklist still helpfully displays "At 3 PM" with a fail cross, so you know exactly when the sun is coming.

<strong>The Overnight Flip</strong>

After sunset, the entire dashboard pivots. The left panel switches to a crescent moon with "Night Time. Beach is closed." The right panel header changes to "Tomorrow (Thursday)" and every metric—temperature, precipitation, wind, sun, and the WMO weather description—swaps to tomorrow's data. You go to bed knowing whether to set an alarm or sleep in.

<strong>The Receipts</strong>

A five-row checklist shows exactly which metric passed or failed: Sun (coming out by 2 PM?), High Temp (above 75°F?), Rain Chance (below 20%?), Max Wind (below 15 mph?), and Air Quality (AQI below 100?). Each row shows the actual value (rounded to the nearest integer) and a pass/fail icon. When it's not a beach day, you can see exactly why at a glance.

Under the Hood

How it works

The system has three layers that are deliberately separated: a Hubitat driver that fetches weather data, a Hubitat app that handles the integration logic, and a Liquid template that renders it on the TRMNL e-ink screen.

1

The Open-Meteo Driver (Groovy)

A Hubitat device driver polls the Open-Meteo Weather and Air Quality APIs on a scheduled cadence. It acts as a pure, modular data collector—fetching today's and tomorrow's temperatures, wind speeds, UV index, and US AQI, and exposing them as standard Hubitat device attributes.

2

The Integration App (Groovy)

A dedicated Hubitat App handles the business logic and TRMNL integration. It subscribes to the weather device's updates, parses the hourly forecast JSON, performs the Option B hourly forecast merging (so past hourly periods are preserved and the clearing time doesn't get lost), rounds all values for clean display, packages the payload, and POSTs it to the TRMNL webhook.

3

The Liquid Template

The TRMNL rendering server executes the Liquid template from scratch on every screen update. It determines whether it's day or night, evaluates the comfort thresholds, decides which of the eight states applies, and renders a split-panel layout with hand-drawn SVG icons. All sizing uses container-query units (cqh/cqw) so the layout scales natively between the TRMNL OG (800×480) and TRMNL X (1872×1404).

4

The Payload Constraint

TRMNL imposes a 2 KB limit on webhook payloads. The Hubitat App compresses hourly forecast data into two-character keys (t for time, f for forecast), truncates ISO timestamps to 13 characters, and caps the array at 26 periods to stay well under the limit.

Built With

The tech stack.

OpOpen-Meteo API — free, no API key, global weather and air quality modelsHuHubitat Elevation — local home automation hub running the Groovy driver and appTRTRMNL — e-ink display platform with Liquid template renderingLiLiquid — Shopify's templating language, executed server-side by TRMNLHTHTML, CSS & SVG — fluid layout with container-query units for e-ink scaling

Explore the implementation details.

Check out the documentation, source files, and build guides to set up your own version.