Product Overview

AnyDash

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.

01

Monday, 8:47 AM

Ask for what you need — and it's there.

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.

A tired worker slumped at a desk, coffee in hand, surrounded by glowing dashboard panels
02

How It Works

Ask the dashboard for what you want to see.

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

chores.open points.byMember walks.gps

generic
widget

Save to dashboard

one click tomorrow

03

How It Holds Together

One data load, shared by the AI and every widget.

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.

BATCHED READ in-memory DATA store KPI Chart Table Leaderboard Heat map Map Members strip

network read on load

7

widget types

0

per-widget network calls

04

Proven, Not Theoretical

First shipped inside Chore Buddy.

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

Chores
Points
📱Screen-time & app engagement
🚶GPS walks
Read the Chore Buddy case study →
05

The Economics

~80 AI requests a day. It can't bill you.

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.

2.0 flash 2.0 lite 2.5 lite 2.5 flash ROTATE ON 429
Spark plan — $0, no billing enabled
TypeWeb Dashboard
StackVanilla JS · Firebase
AI ModelGemini (free tier)
StatusIn Development

What is AnyDash?

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.

Firebase Firestore Auth · Hosting DATA SOURCE batch read AnyDash in-memory DATA store Layout Engine applyOps() Data Dispatcher runTool(name, args) Gemini AI · Firebase AI Logic AI requests bind & render WIDGETS KPI · Members Strip Chart (bar / line / pie) Table · Leaderboard Heat Map Map (GPS routes) Data connects once on load. AI and widgets share the same in-memory store. No repeated network calls.
AnyDash architecture — one data load, shared by AI and every widget.
Firebase Gemini AI Chart.js Leaflet (Maps) SortableJS Vanilla JS App Check

Data Layer — One Read, Everything in Memory

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.

network round-trip on load

DATA

single in-memory store

1 doc

write per save operation

Widgets never hit the network. Every widget calls a local dispatcher — runTool(name, args) — which filters DATA in memory and returns the result instantly.
One exception: the map widget. GPS route points are fetched as a subcollection only when a user opens that widget, then cached locally for the rest of the session.
Writes are minimal. Layouts and AI memory merge into a single Firestore document — no schema migrations, no complex write paths.

Widget System — Recipes, Not Baked Data

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.

AI Builder — Describe It, See It

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.

Edit & Arrange — No Edit Mode

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.

Saved Views — Named, Re-runnable, Per-user

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

Always-on

Saved Views

Named layouts appear as chips on Highlights — one click to switch

Per user

Dash Builder

AI + manual editing surface — load any saved view back here to continue

Editable

All three surfaces share the same layout format. Switching between them preserves every widget exactly as you left it.

Always-Free AI — ~80 Requests/Day

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.

gemini-2.0-flash ~20 req/day 429 2.0-flash-lite ~20 req/day 429 2.5-flash-lite ~20 req/day 429 gemini-2.5-flash ~20 req/day = ~80 free requests/day total — auto-advances on 429, fully transparent to the user
Model rotation chain — four free quota buckets, consumed in sequence.

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.

Security & Privacy

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.