Product Overview
A configurable AI dashboard that connects to any data source, learns your questions, and lets anyone build and rearrange views in plain English — no schemas, no code.
Monday, 8:47 AM
An AI agent fused to a dashboard: say what you need in plain words — or your voice — and today's facts are waiting. Anyone, any skill level, just by prompting.
How It Works
Prompt in plain words — or by voice. The AI picks from a menu of ready-made queries and drops each result into one flexible widget — KPI, chart, table, leaderboard, heat map, map. Like the view? Save it — tomorrow it's one click, not a re-prompt.
Prompt
"Chores open today, by kid."
Menu of Queries
generic
widget
Save to dashboard
one click tomorrow
How It Holds Together
A single batched read fills an in-memory store. Widgets bind to recipes, not numbers — so every saved view re-computes against fresh data the moment it's opened.
1×
network read on load
7
widget types
0
per-widget network calls
Proven, Not Theoretical
AnyDash runs live on a real family's Firestore data — chores, points, screen-time, app engagement, GPS walks. A working product managing a real household, not a demo.
Live data it runs on
The Economics
Four free Gemini models run in rotation, auto-advancing as each hits its quota. It's on Firebase's no-billing Spark plan — past the free tier it throttles, never charges.
AnyDash is a dashboard platform that connects to any structured data source and lets anyone build interactive views in plain English. No configuration files. No predefined schemas. No developer required to add a new widget.
The core idea: describe what you want to see, and the AI builds it as a live, data-bound layout. Every widget stays connected to the source — nothing is baked in. Change your data and every saved view updates automatically.
AnyDash was first built as the manager dashboard for Chore Buddy, a family chore and screen-time app. That deployment proved the architecture on a real, structured Firestore data set — family members, chores, points, game sessions, GPS walks, and device usage all flowing into a single live dashboard.
On sign-in, AnyDash runs a single batched read — Promise.all fires every Firestore query in parallel, all scoped to the authenticated user's data set. Results land in one in-memory DATA object and stay there for the session.
1×
network round-trip on load
DATA
single in-memory store
1 doc
write per save operation
runTool(name, args) — which filters DATA in memory and returns the result instantly.7 widget types, all generically data-bound. The layout stores the recipe; the renderer fetches the data fresh on every load.
KPI
Single metric, large
Members Strip
Card per entity
Chart
Bar / line / pie
Table
Rows & columns
Leaderboard
Ranked list
Heat Map
Entities × time
Map
GPS routes plotted on Google Maps — cycle through each entity's paths
How binding works
Each widget carries a binding: {tool, args} object — for example, {tool:"choreSeries", args:{period:"week"}}. The renderer calls the matching tool function locally against DATA at render time.
Saved layouts store the binding, not the numbers. Open a view next week and every widget re-computes against fresh data automatically.
User prompt
"Show each kid across the top with their chores this week, then a chart of chores per day, and a heat map below."
AI response
Returns a layout tree: row([membersStrip(week)]) · row([chart(choreSeries,week), heatMap(7days)]) — no data, just the recipe. The page fills it in.
Dash Builder — Layout Model
Single-shot JSON model. Emits a layout tree only — the page binds data to it. Forces structured JSON output for reliability.
Ask Tab — Tool-calling Model
Calls data tools to fetch real numbers before answering. Never invents figures — it reads from the same DATA store.
One shared edit engine
AI edits and manual drag-and-drop produce the same applyOps() operations. The AI sees your existing layout, preserves what you've arranged by hand, and never touches locked widgets.
Every widget is draggable and resizable at all times. There is no mode to enter.
Drag to move
Drop into a row — widths auto-rebalance. Drop between rows — a new row is created.
Resize from either edge
Span model: each widget has a span value; width = span ÷ total row spans. 2+1+1 spans → 50% / 25% / 25%. Max 5 widgets per row.
Lock · Duplicate · Delete
Per-widget controls always visible. Locked widgets are ignored by the AI and unaffected by bulk operations.
Content-fit heights
Rows grow to their tallest widget. Charts and maps get sensible default heights. No scrollbars inside widgets.
Save any layout with a name. Views are stored in the user's own document — they are private by default, invisible to other users. Open one next month and it re-computes against whatever the data looks like then.
Daily Highlights
Landing screen — the full overview, editable in place
Saved Views
Named layouts appear as chips on Highlights — one click to switch
Dash Builder
AI + manual editing surface — load any saved view back here to continue
All three surfaces share the same layout format. Switching between them preserves every widget exactly as you left it.
Google's free Gemini tier gives roughly 20 requests per model per day. Tool-calling (used by the Ask tab) can cost 2–4 requests per question. Left unchecked, one busy session would exhaust the quota and break the feature.
Live request meter
Shows the active model and how many requests have been used. When all four models are exhausted: "resets at midnight Pacific." Never an error, never a charge.
Can't bill, ever
Running on Firebase's Spark (free) plan with no billing account attached. Past the free allowance it throttles — it does not charge.
App Check — reCAPTCHA v3
Attached to AI Logic API calls only. Every AI request carries a verified-app token, so the Gemini API only accepts requests from this app — not from bots or scripts scraping the free quota.
No API keys in the page
The Firebase AI Logic SDK proxies through the Firebase project — no raw Gemini key is ever exposed client-side. Only the public Firebase config and reCAPTCHA site key are in the HTML.
Data privacy
The AI is sent aggregates and display names only. In the ChoreBuddy deployment, raw GPS coordinates never leave the data layer — the map tools return metadata (distance, duration, point count) which the model sees, not lat/long pairs.
Firestore Security Rules
All reads and writes are scoped to the authenticated user's data set. Sensitive telemetry collections are manager-write-only. Each user's AI memory document is self-owned — unreadable by other users.
App Check is deliberately applied only to the AI Logic API — not to Firestore or Auth — to avoid blocking legitimate client-side data operations while still protecting the quota-sensitive endpoint.