2026-09-14 Glance Retune From Usage Evidence

What I set out to do

Retune the Glance start page (2026-07-22 Glance Dashboard Prototype) so its modules reflect what I actually pay attention to, starting with stock tickers that weren’t relevant, plus a survey of what Glance and its community widgets offer that I hadn’t used.

What I actually did

  • Survey from evidence, not guesses. Mined Claude Code session history, the vault, the NetNewsWire subscription list and GitHub activity. Top interests by volume: LiteLLM/OpenRouter/SigNoz cost telemetry, open-weight model tracking, Nix, SillyTavern/ComfyUI, the media stack. No evidence at all for the BTC/ETH tickers.
  • Home page.
    • Markets are now SPY, QQQ, ^DJI, META, FFLEX (Fidelity Freedom Index 2060) and USD/CAD, with Yahoo links.
    • New AI Spend tile: Claude Code cost since local midnight from the SigNoz claude_code.cost.usage counter, next to OpenRouter’s daily and monthly usage and credit balance.
    • Hacker News now shares tabs with HF daily papers (sorted by votes), HF trending models and arXiv cs.CL; Lobsters is gone.
    • Blogs are drawn from NetNewsWire, and Simon Willison is capped at 3 posts so he doesn’t flood the list.
    • Added r/NixOS, r/SillyTavernAI and r/comfyui.
    • Release watches now follow the stack I patch and rebase: litellm, SillyTavern, ComfyUI, model-runner, claude-code, codex, prek, uv.
  • Media page. Added a Plex monitor, a Sonarr 7-day calendar, Suwayomi per-series unread counts, and a repository widget for the private media-stack repo.
  • Glance 0.8.6. Pinned via a nixpkgs override because nixpkgs is still on 0.8.5; it needs buildGo127Module. This release fixed the reddit scrape, so the RSS fallback (and its 429s) could be retired.
  • Secrets. glance-wrapper now takes only OPENROUTER_API_KEY from the shared secrets file (sourced in a subshell), gets GITHUB_TOKEN from gh auth token, and defaults every referenced variable to empty.
  • Rollout. Previewed on a second port with screenshots and fixed the layout: 5 reddit tabs overflowed the narrow column. Then hm switch. just check passes. Not yet committed.

What was striking

  • TDD found a real latent bug. The new glance-config flake check runs config:validate through the exact launchd launch line against an empty HOME. It failed immediately on SONARR_API_KEY: any host missing the *arr env files would have lost the whole dashboard, not just two widgets. That’s the same failure class as the reddit vars in 2026-09-06 A Cached Cookie Hid the Reddit Break.
  • Dynamic SigNoz queries need no shim. Glance’s custom-api templates can build requests themselves (newRequest | withStringBody | getResponse) with startOfDay now, so a query with “today” bounds runs straight from YAML.
  • Komga turned out to be the wrong source for recent manga. It held one stale series. Suwayomi’s GraphQL API is where new chapters actually land.

Follow-up: spend from the SigNoz dashboards, calendar gone

  • Calendar removed. Glance’s calendar is a month grid with no event source; wiring Google Calendar (OAuth refresh token) or an iCal service wasn’t worth it yet.
  • AI Spend Today now runs the dashboards’ own queries. It no longer calls the OpenRouter API.
    • Claude Code uses the “Cost by Model” query. LiteLLM uses the “Total Cost” query (gen_ai.cost.total_cost on LLM-call spans), grouped by model.
    • Both are read from the dashboard JSON at eval time, so the tile can’t drift from the dashboards. A renamed panel fails the build.
    • Provider keys used outside LiteLLM aren’t counted, which is accepted.
    • glance-wrapper no longer touches the shared secrets file.
  • Two gotchas.
    • The dashboard files are in the Terraform provider’s shape (snake_case keys, the spec nested under its signal), which query_range rejects with unsupported signal "". They need converting back first.
    • builtins.toJSON sorts keys, so end precedes start. Plain %d placeholders swapped the bounds, and SigNoz returned “start time must be before end time”. Go’s indexed verbs (%[1]d) fixed it. Replaying the rendered query bodies against SigNoz before switching caught this.