You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Weather, calendar, holidays, travel / location, productivity, health / activity, home / IoT, finance, monetization, analytics, gaming, and ambient public-API feeds. Part of the widget catalog index in #41.
Life & Ambient is the catch-all for "personal life quadrant" fetchers — things you glance at on the splash screen that aren't about code or ops.
weather_forecast — Shipped in feat(fetcher): add weather_forecast + fix chart bg #215. Open-Meteo daily forecast (default 3 days, range 1..=7). 9 shapes (TextBlock default + Text / Entries / Ratio / NumberSeries / PointSeries / Bars / Badge / Timeline). Bars carries per-day precipitation probability (%) rather than rainfall amount so chart_bar stays informative in dry forecasts; NumberSeries keeps the rainfall amount in tenths-of-mm/inch for sparkline / histogram consumers. Ratio reports the worst probability in the window labelled with its day (e.g. "Wed rain risk 80%"). Badge picks the worst-severity day and renames the all-clear case to "clear ahead". Textual shapes append precipitation amount only when > 0 (Tue 🌧 18°/13°C 💧80% 8.4mm). Refactor: split src/fetcher/weather.rs into src/fetcher/weather/{mod,common,now,forecast}.rs mirroring the github/ family layout; weather (now) registered name / behaviour unchanged.
weather_alerts — active severe-weather warnings for the configured location (separate read from Open-Meteo: NWS / MeteoAlarm). Timeline / Badge
calendar_* — event calendars
Distinct from the base clock Calendar shape.
calendar_holidays — Nager.Date public-holiday calendar; one fetcher emitting Calendar (month grid w/ holiday days as events), Text (today's holiday name w/ 🎌 prefix), and TextBlock (sorted upcoming list). country (ISO 3166-1 α-2) required, language toggles localName ↔ English. Safe (host hardcoded date.nager.at). Shipped in feat(fetcher): add calendar_holidays — Nager.Date-backed public holidays #155.
calendar_ical — generic iCal URL (Network)
calendar_google — Google OAuth v2
calendar_next_meeting — thin wrapper over the configured source
parcel_tracking — delivery status for tracked shipments (17track / AfterShip / carrier APIs); tracking_numbers as config, watchlist-style. Entries / Timeline / Badge (out for delivery / delivered) / Text. "Where's my package"
fuel_prices — petrol / diesel / EV-charge prices near a location (country-specific public feeds; lat / lon). Entries / Text (cheapest) / Bars
bikeshare_status — bikes / docks available at nearby stations via the CityBikes API (free, no auth, 100s of cities, fixed-host → Safe); network / lat / lon. Entries / Bars / Text / Badge (bikes available)
Productivity
language_streak — Duolingo
toggl_today — tracked time today from Toggl (Text / Ratio / Bars); clockify_today is a sibling
beeminder_goals — Beeminder goal status: safety buffer + due date (Entries / Badge)
rescuetime_today — RescueTime productivity pulse: time by category, not editor keystrokes (Ratio / Text)
deariary_* — auto-generated diary (deariary.com)
Aggregates external tools (GitHub, Calendar, Slack, Linear, Todoist, Toggl, Last.fm, Trakt, Steam, Bluesky, custom webhooks…) into a daily generated entry. Public API: Advanced plan only, Authorization: Bearer deariary_sk_..., base https://api.deariary.com/api/v1, 120 req/min. Safety class Safe — base URL is hardcoded, the token only leaves to a known host (matches the github_* family rule, not Network despite the bearer). Note: streak / "did I write today" concepts do not apply — entries are auto-generated.
Shared HTTP client at src/fetcher/deariary/client.rs: in-process dedup + 60s response cache (so widgets pointing at the same date collapse to fewer unique requests per refresh cycle), 4-permit semaphore, single Retry-After-honoured retry on 429. Disk cache key partitions per resolved token (option > DEARIARY_TOKEN env) via a SHA-256 truncated token_scope prefix so a $HOME/.splashboard/cache directory can't leak account A's entries into account B's widgets.
deariary_today — most recent entry, gated to today or yesterday only (older surrogates fall through to the empty-state placeholder rather than misrepresenting a stale entry as "today"). 6 shapes: TextBlock / Text / MarkdownTextBlock / LinkedTextBlock (single clickable headline → https://app.deariary.com/entries/YYYY/MM/DD) / Entries / Badge (pill label tracks the entry's relative day: today / yesterday / ISO date). Shipped in feat(fetcher): add deariary_* family for diary entries #176.
deariary_recent — newest-first list. 8 shapes: Timeline (default) / Text (headline reports total count, not the row limit) / TextBlock / MarkdownTextBlock / LinkedTextBlock / Entries / Badge / Calendar (highlights this month's entry days). Options: limit (1..=100, default 10), tag. Shipped in feat(fetcher): add deariary_* family for diary entries #176.
deariary_on_this_day — same-day entries from 1m/3m/6m/1y/2y/3y/4y/5y ago via parallel JoinSet. Per-anchor 404 silently skipped; only an all-anchor failure surfaces as an error (so a single 429 doesn't mask the surviving hits). 7 shapes: TextBlock (default) / Timeline / Text (headlines the most distant hit — 5-year throwbacks beat 1-month "PRs reviewed" for ambient interest) / MarkdownTextBlock / LinkedTextBlock / Entries / Badge. Shipped in feat(fetcher): add deariary_* family for diary entries #176.
anki_* / learning
anki_flashcard
kanji_of_day
verb_conjugation
dictionary_lookup
anki_review_count — cards due today via AnkiConnect (local, Safe); distinct from anki_flashcard, which surfaces a card
wanikani_reviews — WaniKani reviews + lessons due (Text / Badge)
health_* — wellness (mostly ReadStore)
health_steps — Apple Health / Fitbit
health_sleep — last night
health_heart_rate
health_calories
health_water
health_screen_time
flu_trends — local flu / respiratory-illness activity level via disease.sh / CDC (free, fixed-host → Safe); region. Badge (low / moderate / high) / Text / NumberSeries. Seasonal public-health awareness
oura_readiness — Oura ring readiness / sleep score (Ratio / Badge); whoop_* is a sibling
Activity tracking
strava_week_distance — feeds ratio
strava_recent_activities — feeds timeline
strava_streak_heatmap — feeds heatmap
garmin_*
fitbit_*
Finance / market (Safe fixed-host for public data; portfolios via ReadStore)
crypto_watchlist — Shipped in feat(fetcher): add crypto_watchlist (CoinGecko, 9 shapes) #210. CoinGecko /coins/markets snapshot, fixed-host so Safety::Safe despite the network call. 9 shapes (Entries default + Text / TextBlock / MarkdownTextBlock / LinkedTextBlock for the row variants, NumberSeries / PointSeries / Bars for the chart variants, Badge for the top-mover pill). Ratio / Image / Calendar / Heatmap / Timeline rejected as forced. Direction-neutral Status mapping (large absolute moves flip Ok → Warn, sign lives in the arrow / label) so the badge doesn't bake in long-vs-short sentiment. NumberSeries values are cents above the period min rather than raw cents — chart_sparkline normalises against series max, so high-magnitude assets like BTC at $40k otherwise collapse into a flat band at the top of the slot.
stock_watchlist — Shipped in feat(fetcher): add stock_watchlist (Yahoo Finance, 9 shapes) #211. Yahoo Finance v8/finance/chart snapshot, fixed-host (query1.finance.yahoo.com) so Safety::Safe despite the network call. Same 9-shape profile as crypto_watchlist (Entries default + Text / TextBlock / MarkdownTextBlock / LinkedTextBlock / NumberSeries / PointSeries / Bars / Badge). One option: symbols (default ["AAPL", "MSFT"], capped at 20). No vs_currency — Yahoo returns each ticker priced in its native listing currency, so the row formatter picks the glyph per stock and falls through to ISO-suffix for unknown codes. Per-symbol fetches fan out via tokio::task::JoinSet and re-sort by input order; an individual 404 silently skips the row so a typo in one ticker does not sink the rest (only an all-failed snapshot surfaces the error). Symbol allowlist is [A-Z0-9.^\-=] so ^GSPC (S&P 500), 7203.T (Toyota), EURUSD=X (forex), and BTC-USD all parse; ^ and = get path-segment percent-encoded so the URL stays well-formed. Same direction-neutral Status mapping and "cents above period min" sparkline trick as crypto_watchlist — re-applied here so a high-magnitude ticker like BRK-A at $600k does not collapse into a flat band glued to the top of the slot.
forex
economic_calendar — upcoming market-moving events (rate decisions, CPI / jobs prints, major earnings dates). Timeline / Entries / Text (next event)
crypto_trending — Shipped in feat(fetcher): add *_trending batch — reddit / wikipedia / crypto / huggingface #242. CoinGecko /search/trending (free, fixed-host → Safe, same source as the shipped crypto_watchlist). 7 shapes (LinkedTextBlock default + ImageLinkedList / TextBlock / Text / MarkdownTextBlock / Entries / Bars). Response already carries thumb / small / large URLs so ImageLinkedList needs no N+1 fan-out. Bars use (MAX_COUNT - position).max(1) for rank-encoding rather than CoinGecko's own score field, which decays to zero for the lower half and collapses chart_bar. Options: count 1..=15 (server returns max 15), vs_currency matches the crypto_watchlist quote-currency contract; falls back to · trending when the requested currency isn't populated yet for a freshly-trending obscure coin.
economic_indicators — macro indicators via FRED (free, fixed-host → Safe): inflation / unemployment / rates / GDP. filter_series. Entries / Text / NumberSeries / Bars
congress_trades — recent stock trades disclosed by members of Congress / politicians (House Stock Watcher / Quiver-style public data, fixed-host → Safe); filter_member / filter_ticker. Timeline / Entries / Text
fear_greed_index — Crypto / CNN Fear & Greed sentiment index (Ratio / Badge / Text)
ynab_budget — You Need A Budget: category balances + age-of-money; actualbudget_* is the self-hosted sibling (Safe once host fixed)
Monetization
stripe_mrr
stripe_revenue_today
patreon_patrons
kofi_tips_week
Own-site analytics
plausible_visitors_today
umami_visitors_today
goatcounter_visitors_today
posthog_events
google_analytics_visitors
Home / IoT
home_assistant_entity — any HA entity value (self-hosted URL, Safe once fixed at config time)
tesla_battery
tesla_location
hue_*
mqtt_topic — value of a configured MQTT topic; generic IoT bridge, Safe once the broker is fixed at config time (same model as home_assistant_entity)
deal_free_games — shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240 (was: epic_free_games). Generalized via the LootScraper aggregator (feed.eikowagenknecht.com) so one fetcher covers Epic + Steam + Amazon Prime Gaming + GOG + Humble + itch.io + Apple App Store + Google Play; platform filter picks one source, kind = "loot" switches to Twitch-drops / in-game-items (Amazon and Steam only)
deal_steam_daily — shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240. Wraps Steam's official /feeds/daily_deals.xml, parses the discount percent out of "Daily Deal - <Title>, X% Off" marketing-prefix titles. Was not previously on the roadmap; added during the deal_* batch as the "Steam's authoritative daily-rotating deal feed" sibling to the cross-store deal_games
lichess_profile — Lichess rating per time-control + daily puzzle; chess_com is a sibling
steam_charts — shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249. ISteamChartsService/GetMostPlayedGames (public, no auth → Safe) ranked by 24h peak concurrent count; appid → game name resolved via parallel store.steampowered.com/api/appdetails calls (the chart endpoint returns appid only), with an app/<id> fallback so a single 404 doesn't sink the chart. 10 shapes. The Steam slot in the *_trending family
Shopping / deals
deal_games — shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240 (was: game_deals). CheapShark /api/1.0/deals with min_discount / limit / stores (CheapShark store-ID allowlist: 1=Steam, 7=GOG, 25=Epic, 11=Humble, 15=Fanatical, …). 9 shapes via the shared DealRow model; filter_wishlist from the original spec deferred (would require a steam_wishlist_sales-style personal-account integration)
sale_events — kept open; no free public feed publishes vendor-specific upcoming sale dates (Amazon Prime Day, Steam Summer Sale, Epic Mega Sale). SteamDB has the data but only via HTML page (no API); Awareness Days has it but paid (£29/yr). Holiday-anchored sale events (Black Friday, Cyber Monday, Boxing Day, Singles Day) overlap with the shipped calendar_holidays. Reopen when a reliable upstream exists
Live events
concerts_nearby — upcoming concerts near you from artists you follow, via Bandsintown (free app-id, fixed-host → Safe); location + filter_artists. Timeline / list_cards / Text (next show). Songkick is an auth-based sibling
Sports
Followed-team / followed-league data. Filter-first: shared filter_teams / filter_leagues / filter_sports options pick which resources are queried; the host is fixed (TheSportsDB / football-data.org / ESPN public JSON), so Safety::Safe. f1_next_race below is the motorsport member of this family. Fits the one-shot model: a fixture is a cached future event, a result is checkable state.
sports_fixtures — upcoming matches for followed teams / leagues. Timeline (default) / TextBlock / Entries / Text (next-match headline) / Badge (match today / live now / none soon)
sports_results — recent finished matches for followed teams. Timeline / Entries / TextBlock / Text (last result) / Badge (won / lost / draw)
sports_standings — league table for a followed league, your team's row highlighted. Entries / Bars / Text (your position) / MarkdownTextBlock
E-sports
Same shape contract as sports_*, different upstream (PandaScore / abios free tiers, fixed host -> Safe). Filter-first: filter_games (lol / cs2 / dota2 / valorant / ...) + filter_teams.
esports_matches — upcoming / live matches for followed e-sports teams. Timeline / Entries / Text / Badge (live now)
esports_standings — tournament / league standings for a followed event. Entries / Bars / Text
Ambient public-API feeds
iss_position — where the ISS is now
spacex_next_launch
usgs_earthquake — recent large quakes (Timeline / Heatmap)
air_quality — OpenAQ (Ratio)
tide_today — NOAA Tides
f1_next_race — Ergast API
aurora_forecast — aurora visibility probability (NOAA Kp index) for the configured latitude (Ratio / Badge) — ambient delight
hibp_breaches — Have I Been Pwned: new breaches involving the configured email (Badge / Timeline) — ambient security check
pollen_count — local pollen / allergy index (Ratio / Badge)
space_launches — next rocket launches across all providers via Launch Library 2 (thespacedevs, free fixed-host); generalises the SpaceX-only spacex_next_launch above. Timeline / Text (next launch) / Badge (launch today)
flights_overhead — aircraft currently overhead via the OpenSky Network API (free, fixed-host); lat / lon / radius options. Entries (callsign -> origin / altitude) / Text (count + nearest) / media_ascii_map. Same ambient-snapshot model as iss_position
recipe_daily — a random recipe of the day from TheMealDB (free, fixed-host → Safe). Text / TextBlock / Image (dish photo) / MarkdownTextBlock (ingredients + steps)
grid_carbon — carbon intensity + renewable mix of your electricity grid (UK Carbon Intensity API / ElectricityMaps; free, fixed-host → Safe); region. Ratio / Text / Badge (clean / dirty) — actionable: time heavy workloads when the grid is clean
co2_now — latest atmospheric CO2 ppm (Mauna Loa / NOAA Global Monitoring Lab). Text / NumberSeries (trend) — ambient "state of the planet" awareness
satellite_passes — visible ISS / satellite passes for your location (N2YO; lat / lon). Timeline / Text (next visible pass) / Badge (visible tonight)
wildfire_activity — active wildfires near a location via NASA FIRMS (free, fixed-host → Safe); lat / lon / radius. Entries / Badge / media_ascii_map. Complements the planned usgs_earthquake
stargazing_forecast — tonight's cloud cover / seeing / transparency for astronomy via 7Timer! ASTRO (free, no auth, fixed-host → Safe); lat / lon. Badge (good seeing / cloudy) / Text / Timeline. Pairs with aurora_forecast / satellite_passes / astronomy_events
Weather, calendar, holidays, travel / location, productivity, health / activity, home / IoT, finance, monetization, analytics, gaming, and ambient public-API feeds. Part of the widget catalog index in #41.
Life & Ambient is the catch-all for "personal life quadrant" fetchers — things you glance at on the splash screen that aren't about code or ops.
weather_*weather_now— shipped in feat(fetcher): add fetchers + shape extensions for 0.x presets #88 asweather(Open-Meteo, fixed host;latitude/longitude/units;Entriesprimary +Text+PointSeries+NumberSeries+Bars+Badge);PixelArt(eight 16x16 sprites mapping WMO codes to sky condition) added in feat(render,weather): PixelArt shape + media_pixel + weather sprites #260.weather_forecast— Shipped in feat(fetcher): add weather_forecast + fix chart bg #215. Open-Meteo daily forecast (default 3 days, range 1..=7). 9 shapes (TextBlock default + Text / Entries / Ratio / NumberSeries / PointSeries / Bars / Badge / Timeline).Barscarries per-day precipitation probability (%) rather than rainfall amount sochart_barstays informative in dry forecasts;NumberSerieskeeps the rainfall amount in tenths-of-mm/inch for sparkline / histogram consumers.Ratioreports the worst probability in the window labelled with its day (e.g. "Wed rain risk 80%").Badgepicks the worst-severity day and renames the all-clear case to "clear ahead". Textual shapes append precipitation amount only when > 0 (Tue 🌧 18°/13°C 💧80% 8.4mm). Refactor: splitsrc/fetcher/weather.rsintosrc/fetcher/weather/{mod,common,now,forecast}.rsmirroring thegithub/family layout;weather(now) registered name / behaviour unchanged.weather_alerts— active severe-weather warnings for the configured location (separate read from Open-Meteo: NWS / MeteoAlarm). Timeline / Badgecalendar_*— event calendarsDistinct from the base
clockCalendar shape.calendar_holidays— Nager.Date public-holiday calendar; one fetcher emittingCalendar(month grid w/ holiday days asevents),Text(today's holiday name w/ 🎌 prefix), andTextBlock(sorted upcoming list).country(ISO 3166-1 α-2) required,languagetoggleslocalName↔ English. Safe (host hardcodeddate.nager.at). Shipped in feat(fetcher): add calendar_holidays — Nager.Date-backed public holidays #155.calendar_ical— generic iCal URL (Network)calendar_google— Google OAuth v2calendar_next_meeting— thin wrapper over the configured sourcecalendar_today_eventscalendar_caldav— generic CalDAV (Fastmail / Nextcloud / iCloud); self-hosted-friendly counterpart tocalendar_googletravel_*— location & transittravel_location— current GPS / IPtravel_commute— commute timetravel_transit— next departuretravel_flight— flight statustravel_contact_timezoneparcel_tracking— delivery status for tracked shipments (17track / AfterShip / carrier APIs);tracking_numbersas config, watchlist-style. Entries / Timeline / Badge (out for delivery/delivered) / Text. "Where's my package"fuel_prices— petrol / diesel / EV-charge prices near a location (country-specific public feeds;lat/lon). Entries / Text (cheapest) / Barsbikeshare_status— bikes / docks available at nearby stations via the CityBikes API (free, no auth, 100s of cities, fixed-host →Safe);network/lat/lon. Entries / Bars / Text / Badge (bikes available)Productivity
language_streak— Duolingotoggl_today— tracked time today from Toggl (Text / Ratio / Bars);clockify_todayis a siblingbeeminder_goals— Beeminder goal status: safety buffer + due date (Entries / Badge)habitica_dailies— Habitica dailies / to-dos + streak (Entries / Badge)rescuetime_today— RescueTime productivity pulse: time by category, not editor keystrokes (Ratio / Text)deariary_*— auto-generated diary (deariary.com)Aggregates external tools (GitHub, Calendar, Slack, Linear, Todoist, Toggl, Last.fm, Trakt, Steam, Bluesky, custom webhooks…) into a daily generated entry. Public API: Advanced plan only,
Authorization: Bearer deariary_sk_..., basehttps://api.deariary.com/api/v1, 120 req/min. Safety classSafe— base URL is hardcoded, the token only leaves to a known host (matches thegithub_*family rule, notNetworkdespite the bearer). Note: streak / "did I write today" concepts do not apply — entries are auto-generated.Shared HTTP client at
src/fetcher/deariary/client.rs: in-process dedup + 60s response cache (so widgets pointing at the same date collapse to fewer unique requests per refresh cycle), 4-permit semaphore, single Retry-After-honoured retry on 429. Disk cache key partitions per resolved token (option >DEARIARY_TOKENenv) via a SHA-256 truncatedtoken_scopeprefix so a$HOME/.splashboard/cachedirectory can't leak account A's entries into account B's widgets.deariary_today— most recent entry, gated to today or yesterday only (older surrogates fall through to the empty-state placeholder rather than misrepresenting a stale entry as "today"). 6 shapes:TextBlock/Text/MarkdownTextBlock/LinkedTextBlock(single clickable headline →https://app.deariary.com/entries/YYYY/MM/DD) /Entries/Badge(pill label tracks the entry's relative day:today/yesterday/ ISO date). Shipped in feat(fetcher): add deariary_* family for diary entries #176.deariary_recent— newest-first list. 8 shapes:Timeline(default) /Text(headline reports total count, not the row limit) /TextBlock/MarkdownTextBlock/LinkedTextBlock/Entries/Badge/Calendar(highlights this month's entry days). Options:limit(1..=100, default 10),tag. Shipped in feat(fetcher): add deariary_* family for diary entries #176.deariary_on_this_day— same-day entries from 1m/3m/6m/1y/2y/3y/4y/5y ago via parallelJoinSet. Per-anchor 404 silently skipped; only an all-anchor failure surfaces as an error (so a single 429 doesn't mask the surviving hits). 7 shapes:TextBlock(default) /Timeline/Text(headlines the most distant hit — 5-year throwbacks beat 1-month "PRs reviewed" for ambient interest) /MarkdownTextBlock/LinkedTextBlock/Entries/Badge. Shipped in feat(fetcher): add deariary_* family for diary entries #176.anki_*/ learninganki_flashcardkanji_of_dayverb_conjugationdictionary_lookupanki_review_count— cards due today via AnkiConnect (local, Safe); distinct fromanki_flashcard, which surfaces a cardwanikani_reviews— WaniKani reviews + lessons due (Text / Badge)health_*— wellness (mostly ReadStore)health_steps— Apple Health / Fitbithealth_sleep— last nighthealth_heart_ratehealth_calorieshealth_waterhealth_screen_timeflu_trends— local flu / respiratory-illness activity level via disease.sh / CDC (free, fixed-host →Safe);region. Badge (low/moderate/high) / Text / NumberSeries. Seasonal public-health awarenessoura_readiness— Oura ring readiness / sleep score (Ratio / Badge);whoop_*is a siblingActivity tracking
strava_week_distance— feedsratiostrava_recent_activities— feedstimelinestrava_streak_heatmap— feedsheatmapgarmin_*fitbit_*Finance / market (Safe fixed-host for public data; portfolios via ReadStore)
crypto_watchlist— Shipped in feat(fetcher): add crypto_watchlist (CoinGecko, 9 shapes) #210. CoinGecko/coins/marketssnapshot, fixed-host soSafety::Safedespite the network call. 9 shapes (Entries default + Text / TextBlock / MarkdownTextBlock / LinkedTextBlock for the row variants, NumberSeries / PointSeries / Bars for the chart variants, Badge for the top-mover pill). Ratio / Image / Calendar / Heatmap / Timeline rejected as forced. Direction-neutral Status mapping (large absolute moves flip Ok → Warn, sign lives in the arrow / label) so the badge doesn't bake in long-vs-short sentiment. NumberSeries values are cents above the period min rather than raw cents —chart_sparklinenormalises against series max, so high-magnitude assets like BTC at $40k otherwise collapse into a flat band at the top of the slot.stock_watchlist— Shipped in feat(fetcher): add stock_watchlist (Yahoo Finance, 9 shapes) #211. Yahoo Financev8/finance/chartsnapshot, fixed-host (query1.finance.yahoo.com) soSafety::Safedespite the network call. Same 9-shape profile ascrypto_watchlist(Entries default + Text / TextBlock / MarkdownTextBlock / LinkedTextBlock / NumberSeries / PointSeries / Bars / Badge). One option:symbols(default["AAPL", "MSFT"], capped at 20). Novs_currency— Yahoo returns each ticker priced in its native listing currency, so the row formatter picks the glyph per stock and falls through to ISO-suffix for unknown codes. Per-symbol fetches fan out viatokio::task::JoinSetand re-sort by input order; an individual404silently skips the row so a typo in one ticker does not sink the rest (only an all-failed snapshot surfaces the error). Symbol allowlist is[A-Z0-9.^\-=]so^GSPC(S&P 500),7203.T(Toyota),EURUSD=X(forex), andBTC-USDall parse;^and=get path-segment percent-encoded so the URL stays well-formed. Same direction-neutral Status mapping and "cents above period min" sparkline trick ascrypto_watchlist— re-applied here so a high-magnitude ticker likeBRK-Aat $600k does not collapse into a flat band glued to the top of the slot.forexeconomic_calendar— upcoming market-moving events (rate decisions, CPI / jobs prints, major earnings dates).Timeline/Entries/Text(next event)crypto_trending— Shipped in feat(fetcher): add *_trending batch — reddit / wikipedia / crypto / huggingface #242. CoinGecko/search/trending(free, fixed-host →Safe, same source as the shippedcrypto_watchlist). 7 shapes (LinkedTextBlockdefault +ImageLinkedList/TextBlock/Text/MarkdownTextBlock/Entries/Bars). Response already carriesthumb/small/largeURLs soImageLinkedListneeds no N+1 fan-out. Bars use(MAX_COUNT - position).max(1)for rank-encoding rather than CoinGecko's ownscorefield, which decays to zero for the lower half and collapseschart_bar. Options:count1..=15 (server returns max 15),vs_currencymatches thecrypto_watchlistquote-currency contract; falls back to· trendingwhen the requested currency isn't populated yet for a freshly-trending obscure coin.economic_indicators— macro indicators via FRED (free, fixed-host →Safe): inflation / unemployment / rates / GDP.filter_series. Entries / Text / NumberSeries / Barscongress_trades— recent stock trades disclosed by members of Congress / politicians (House Stock Watcher / Quiver-style public data, fixed-host →Safe);filter_member/filter_ticker. Timeline / Entries / Textfear_greed_index— Crypto / CNN Fear & Greed sentiment index (Ratio / Badge / Text)ynab_budget— You Need A Budget: category balances + age-of-money;actualbudget_*is the self-hosted sibling (Safe once host fixed)Monetization
stripe_mrrstripe_revenue_todaypatreon_patronskofi_tips_weekOwn-site analytics
plausible_visitors_todayumami_visitors_todaygoatcounter_visitors_todayposthog_eventsgoogle_analytics_visitorsHome / IoT
home_assistant_entity— any HA entity value (self-hosted URL, Safe once fixed at config time)tesla_batterytesla_locationhue_*mqtt_topic— value of a configured MQTT topic; generic IoT bridge, Safe once the broker is fixed at config time (same model ashome_assistant_entity)Gaming
steam_playtime_week— shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249, absorbed intosteam_recently_played'sTextshape (sumsplaytime_2weeksinto an "Xh across N games this week" headline) rather than a separate fetcher — same read, different presentationsteam_recently_played— shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249.IPlayerService/GetRecentlyPlayedGames; 11 shapes. Part of thesteam_*family batch (sharedclient.rs/common.rs/games.rs, mirrors thelastfm_*layout)steam_player_summary— shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249 (not previously on the roadmap; added as a family sibling).GetPlayerSummaries+GetSteamLevelin parallel → profile snapshot (persona / level / online status / current game / last logoff); 8 shapessteam_owned_games— shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249 (not previously on the roadmap; added as a family sibling).GetOwnedGames; library ranked by total playtime orsort = "recent"(relative-date value column); 11 shapessteam_wishlist_sales— kept open; scoped out of thedeal_*batch (feat(fetcher): add deal_* family for gaming deal aggregators #240) as personal-account data rather than a world-facing deal feed. Also deferred from the feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249steam_*batch — Valve has been progressively locking down the unauthenticated wishlist endpointplaystation_recent_trophiesxbox_recent_trophiesriot_rankdeal_free_games— shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240 (was:epic_free_games). Generalized via the LootScraper aggregator (feed.eikowagenknecht.com) so one fetcher covers Epic + Steam + Amazon Prime Gaming + GOG + Humble + itch.io + Apple App Store + Google Play;platformfilter picks one source,kind = "loot"switches to Twitch-drops / in-game-items (Amazon and Steam only)deal_steam_daily— shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240. Wraps Steam's official/feeds/daily_deals.xml, parses the discount percent out of"Daily Deal - <Title>, X% Off"marketing-prefix titles. Was not previously on the roadmap; added during thedeal_*batch as the "Steam's authoritative daily-rotating deal feed" sibling to the cross-storedeal_gameslichess_profile— Lichess rating per time-control + daily puzzle;chess_comis a siblingsteam_charts— shipped in feat(fetcher): add steam_* family (player_summary, recently_played, owned_games, charts) #249.ISteamChartsService/GetMostPlayedGames(public, no auth →Safe) ranked by 24h peak concurrent count; appid → game name resolved via parallelstore.steampowered.com/api/appdetailscalls (the chart endpoint returns appid only), with anapp/<id>fallback so a single 404 doesn't sink the chart. 10 shapes. The Steam slot in the*_trendingfamilyShopping / deals
deal_games— shipped in feat(fetcher): add deal_* family for gaming deal aggregators #240 (was:game_deals). CheapShark/api/1.0/dealswithmin_discount/limit/stores(CheapShark store-ID allowlist: 1=Steam, 7=GOG, 25=Epic, 11=Humble, 15=Fanatical, …). 9 shapes via the sharedDealRowmodel;filter_wishlistfrom the original spec deferred (would require asteam_wishlist_sales-style personal-account integration)sale_events— kept open; no free public feed publishes vendor-specific upcoming sale dates (Amazon Prime Day, Steam Summer Sale, Epic Mega Sale). SteamDB has the data but only via HTML page (no API); Awareness Days has it but paid (£29/yr). Holiday-anchored sale events (Black Friday, Cyber Monday, Boxing Day, Singles Day) overlap with the shippedcalendar_holidays. Reopen when a reliable upstream existsLive events
concerts_nearby— upcoming concerts near you from artists you follow, via Bandsintown (free app-id, fixed-host →Safe);location+filter_artists.Timeline/list_cards/Text(next show). Songkick is an auth-based siblingSports
Followed-team / followed-league data. Filter-first: shared
filter_teams/filter_leagues/filter_sportsoptions pick which resources are queried; the host is fixed (TheSportsDB / football-data.org / ESPN public JSON), soSafety::Safe.f1_next_racebelow is the motorsport member of this family. Fits the one-shot model: a fixture is a cached future event, a result is checkable state.sports_fixtures— upcoming matches for followed teams / leagues.Timeline(default) /TextBlock/Entries/Text(next-match headline) /Badge(match today/live now/none soon)sports_results— recent finished matches for followed teams.Timeline/Entries/TextBlock/Text(last result) /Badge(won/lost/draw)sports_standings— league table for a followed league, your team's row highlighted.Entries/Bars/Text(your position) /MarkdownTextBlockE-sports
Same shape contract as
sports_*, different upstream (PandaScore / abios free tiers, fixed host ->Safe). Filter-first:filter_games(lol/cs2/dota2/valorant/ ...) +filter_teams.esports_matches— upcoming / live matches for followed e-sports teams.Timeline/Entries/Text/Badge(live now)esports_standings— tournament / league standings for a followed event.Entries/Bars/TextAmbient public-API feeds
iss_position— where the ISS is nowspacex_next_launchusgs_earthquake— recent large quakes (Timeline / Heatmap)air_quality— OpenAQ (Ratio)tide_today— NOAA Tidesf1_next_race— Ergast APIaurora_forecast— aurora visibility probability (NOAA Kp index) for the configured latitude (Ratio / Badge) — ambient delightsunset_quality— predicted sunset quality / golden-hour times (Text / Badge)nasa_neo— near-Earth objects passing today (Timeline / Text)astronomy_events— upcoming meteor showers / eclipses / planetary events (Timeline)hibp_breaches— Have I Been Pwned: new breaches involving the configured email (Badge / Timeline) — ambient security checkpollen_count— local pollen / allergy index (Ratio / Badge)space_launches— next rocket launches across all providers via Launch Library 2 (thespacedevs, free fixed-host); generalises the SpaceX-onlyspacex_next_launchabove.Timeline/Text(next launch) /Badge(launch today)flights_overhead— aircraft currently overhead via the OpenSky Network API (free, fixed-host);lat/lon/radiusoptions.Entries(callsign -> origin / altitude) /Text(count + nearest) /media_ascii_map. Same ambient-snapshot model asiss_positionrecipe_daily— a random recipe of the day from TheMealDB (free, fixed-host →Safe).Text/TextBlock/Image(dish photo) /MarkdownTextBlock(ingredients + steps)grid_carbon— carbon intensity + renewable mix of your electricity grid (UK Carbon Intensity API / ElectricityMaps; free, fixed-host →Safe);region. Ratio / Text / Badge (clean/dirty) — actionable: time heavy workloads when the grid is cleanco2_now— latest atmospheric CO2 ppm (Mauna Loa / NOAA Global Monitoring Lab). Text / NumberSeries (trend) — ambient "state of the planet" awarenesssatellite_passes— visible ISS / satellite passes for your location (N2YO;lat/lon). Timeline / Text (next visible pass) / Badge (visible tonight)wildfire_activity— active wildfires near a location via NASA FIRMS (free, fixed-host →Safe);lat/lon/radius. Entries / Badge /media_ascii_map. Complements the plannedusgs_earthquakestargazing_forecast— tonight's cloud cover / seeing / transparency for astronomy via 7Timer! ASTRO (free, no auth, fixed-host →Safe);lat/lon. Badge (good seeing/cloudy) / Text / Timeline. Pairs withaurora_forecast/satellite_passes/astronomy_events