Skip to content

meta: fetcher roadmap - Life & Ambient #68

Description

@unhappychoice

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 as weather (Open-Meteo, fixed host; latitude / longitude / units; Entries primary + 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). 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
  • calendar_today_events
  • calendar_caldav — generic CalDAV (Fastmail / Nextcloud / iCloud); self-hosted-friendly counterpart to calendar_google

travel_* — location & transit

  • travel_location — current GPS / IP
  • travel_commute — commute time
  • travel_transit — next departure
  • travel_flight — flight status
  • travel_contact_timezone
  • 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)
  • 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_..., 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)

Gaming

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
  • sunset_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 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    widgetBuilt-in widget

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions