Pivot
Pivot is a high-performance real time analytics database on open data formats.
Correct answers from your database on the first try. CheckMyData understands your schema and codebase, so plain-English questions become trustworthy SQL. Open-source, self-hostable, privacy-first.
DataPython · TypeScriptGitHub @CheckMyData-AIOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
AI-powered database query agent with natural language chat and data visualization
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
AI-powered database query agent that analyzes Git repositories, understands database schemas, and lets you query databases through natural language chat with rich data visualization.
Supported databases: PostgreSQL, MySQL, ClickHouse, MongoDB (plus file-backed SQLite, which powers the built-in demo)
Supported analytics sources: Google Analytics 4 (App Store Connect and Google Play reserved — see docs/ANALYTICS_SOURCES.md)
LLM providers: OpenAI, Anthropic, OpenRouter
Project tracking: Linear — CheckMyData.ai (single source of truth for tasks, backlog, and bugs)Read the full README ↗AI-powered database query agent that analyzes Git repositories, understands database schemas, and lets you query databases through natural language chat with rich data visualization.
Supported databases: PostgreSQL, MySQL, ClickHouse, MongoDB (plus file-backed SQLite, which powers the built-in demo)
Supported analytics sources: Google Analytics 4 (App Store Connect and Google Play reserved — see docs/ANALYTICS_SOURCES.md)
LLM providers: OpenAI, Anthropic, OpenRouter
Project tracking: Linear — CheckMyData.ai (single source of truth for tasks, backlog, and bugs)
Intelligence remediation (W0–W6), self-completing embedding reconcile, and
sync/orchestrator hardening, followed by a full UX-audit remediation
(email verification, password reset, invite decline, dashboard/batch fixes)
and the R3 cross-tenant isolation release. See
CHANGELOG.md for the full list.
DataGate blocks impossible numbers on both the single-query and
pipeline paths.git clone https://github.com/CheckMyData-AI/checkmydata-ai.git
cd checkmydata-ai
make setup # Install deps, create .env, run migrations
make dev # Backend on :8000, frontend on :3100
Open http://localhost:3100 to see the landing page, then click Get Started to register. See INSTALLATION.md for detailed setup instructions.
| Document | Description |
|---|---|
| vision.md | Product vision and guiding principles |
| INSTALLATION.md | Setup, deployment, and configuration |
| USAGE.md | Step-by-step user guide for all features |
| API.md | REST API reference |
| ARCHITECTURE.md | System design and module overview |
| docs/SYSTEM_ARCHITECTURE.md | Deep-dive: orchestrator, memory, LLM routing, feedback loops |
| docs/GIT_ACCESS_AUDIT_AND_ROADMAP.md | Live Git access architecture audit + Phase 1–4 roadmap |
| DESIGN_SYSTEM.md | UI design system, tokens, pipeline primitives, and component guidelines |
| CONTRIBUTING.md | How to contribute |
| CHANGELOG.md | Release history |
| ROADMAP.md |
┌───────────────────────────────────────────────────────────────────────┐
│ User (Browser) │
│ ┌─────────┐ ┌──────────────┐ ┌──────────┐ ┌────────────┐ ┌──────┐│
│ │ Auth │ │ Sidebar │ │ Chat │ │ Visualiz. │ │Notes ││
│ │ Gate │ │ (Projects, │ │ Panel │ │ (Table/ │ │Panel ││
│ │ │ │ Connections, │ │ │ │ Chart/ │ │(Saved││
│ │ │ │ SSH Keys, │ │ │ │ Export) │ │Quer.)││
│ │ │ │ Rules, Docs)│ │ │ │ │ │ ││
│ └────┬────┘ └──────┬───────┘ └────┬─────┘ └─────┬──────┘ └──┬───┘│
│ │ │ │ │ │ │
└───────┼──────────────┼───────────────┼──────────────┼────────────┼────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌───────────────────────────────────────────────────────────────────────┐
│ FastAPI Backend (Python) │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ API Layer (/api/...) │ │
│ │ auth · projects · connections · ssh-keys · chat · notes │ │
│ │ repos · rules · visualizations · workflows · data-validation │ │
│ │ batch · dashboards · usage · data-graph · insights · demo │ │
│ └──────────────────────────┬─────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼─────────────────────────────────────┐ │
│ │ Multi-Agent System │ │
│ │ OrchestratorAgent → LLM-driven loop (gather → synthesize) │ │
│ │ SQLAgent: schema + SQL gen + validation + execution │ │
│ │ VizAgent: chart type + config (LLM-driven) │ │
│ │ KnowledgeAgent: RAG search + entity info + codebase Q&A │ │
│ │ GitAgent: live read-only Git history + releases │ │
│ │ AdaptivePlanner: quick/full plan generation + replan │ │
│ │ DataGate: intermediate data-quality validation │ │
│ │ AgentResultValidator: validates before returning to user │ │
│ └──┬────────┬───────────┬────────────┬───────────────────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────────┐ ┌──────────┐ ┌────────────────────────────┐ │
│ │ LLM │ │Knowledge │ │Connectors│ │ Workflow Tracker │ │
│ │Router│ │ Layer │ │(PG,MySQL,│ │ (SSE events, structured │ │
│ │ │ │ │ │ Mongo,CH)│ │ logging, step-by-step │ │
│ │OpenAI│ │ Git repo │ │ │ │ progress) │ │
│ │Anthro│ │ ChromaDB │ │SSH tunnel│ │ │ │
│ │OpenR.│ │ Doc gen │ │support │ │ │ │
│ └──────┘ └──────────┘ └──────────┘ └────────────────────────────┘ │
│ │
│ Internal Storage: SQLite (agent.db) + ChromaDB (vectors) │
└───────────────────────────────────────────────────────────────────────┘
Five main flows:
status field) and polls for completion, showing a "Processing in background" indicator until the response appears. The OrchestratorAgent routes to SQLAgent (DB queries), KnowledgeAgent (codebase Q&A), or responds directly. Results include rich visualizations, follow-up suggestions, and data insights.max_pipeline_replans, default 2; replan history is threaded into the prompt so the LLM avoids repeating failed approaches), context-aware routing, hardened history-aware turn isolation (conversation history is read-only reference — prior turns are never re-executed, raw SQL is stripped from history, and a per-turn dedup safety net skips queries already answered in the same turn), semantic tool-call deduplication, continuation-aware analysis resumption, and structured clarification questions (yes/no, multiple choice, free text) when user intent is ambiguous. A unified router performs a single LLM call to determine route, complexity, approach, and estimated queries. Per-viz timeouts (15s with table fallback) and empty-answer guards ensure queries always produce a visible response. Dynamic budget injection per iteration replaces rigid step/time cutoffs — the LLM self-regulates tool usage based on budget status. Parallel stage execution (pipeline_max_parallel_stages, default 3) runs independent stages concurrently via topological scheduling. Stage failures are classified (transient | configuration | data_missing | fatal) so non-retryable errors short-circuit the retry loop. When analysis hits the budget limit, an LLM-based Answer Validator decides whether the partial answer addresses the question — only then is the "Continue analysis" button shown, preserving executed SQL queries, intermediate results, and partial findings.POST /connections/{id}/learnings/validate-schema) to deactivate learnings referencing dropped tables. Nine learning categories are supported: Table Preferences, Column Usage, Data Formats, Query Patterns, Schema Gotchas, Performance Hints, Pipeline Patterns, Data Quality Hints, and Replan Recoveries| Route | Description |
|---|---|
/ | Public landing page with product overview |
/pricing | Plans & pricing with Stripe Checkout |
/login | Login / registration page |
/app | Main application (requires authentication) |
/about | About page -- mission, tech stack |
/contact | Contact information and channels |
/support | FAQ, documentation links, support channels |
/terms | Terms of Service |
/privacy | Privacy Policy |
/dashboard/[id] | Shared dashboard viewer |
Copy backend/.env.example to backend/.env and set the required values. See INSTALLATION.md for the full environment variable reference.
Required:
| Variable | Description |
|---|---|
MASTER_ENCRYPTION_KEY | Fernet key for encrypting stored credentials. Generate: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" |
JWT_SECRET | Secret for signing JWT tokens (change from default in production) |
| One LLM API key | OPENAI_API_KEY, ANTHROPIC_API_KEY, or OPENROUTER_API_KEY |
Optional: AUTH_COOKIE_DOMAIN (shared parent domain for session/CSRF cookies, e.g. .checkmydata.ai — required when the SPA and API run on different subdomains, otherwise the CSRF cookie is unreadable by the SPA and login fails), GOOGLE_CLIENT_ID (Google OAuth), RESEND_API_KEY (transactional emails), REDIS_URL (shared cache + task queue), DATABASE_URL (PostgreSQL for production), AGENT_WALL_CLOCK_TIMEOUT_SECONDS (orchestrator time limit, default 180s), MAX_PARALLEL_TOOL_CALLS (concurrent tool cap, default 2), PIPELINE_MAX_PARALLEL_STAGES (concurrent pipeline stages, default 3), MAX_PIPELINE_REPLANS (replan attempts, default 2), ANSWER_VALIDATOR_ENABLED (LLM quality gate on partial answers, default true), LEARNING_ANALYZER_MODE (heuristic | hybrid | llm_first, default llm_first), MAX_ORCHESTRATOR_ITERATIONS (tool-loop ceiling, default 100), LLM_RESULT_PREVIEW_ROWS (result rows shown to the LLM, default 50), MAINTENANCE_INTERVAL_HOURS (learning/insight decay cadence, default 24), SSH_HOST_KEY_POLICY (disabled | tofu | strict, default tofu; unknown values fail closed to strict; with SSH_KNOWN_HOSTS_PATH), SSH_PRE_COMMAND_ALLOWLIST_ENABLED (validate SSH pre-commands against a safe-pattern allowlist, default true), QUERY_EMPTY_RESULT_RETRY (treat an empty result as suspicious and retry once within the correction budget, default true), ORCHESTRATOR_MAX_RESULT_CORRECTIONS (result-gate correction budget, >= 0, default 2), AUTH_COOKIE_SECURE / AUTH_COOKIE_SAMESITE (browser session is delivered as an httpOnly cookie + CSRF; set AUTH_COOKIE_SECURE=false only for local http), SECURITY_CSP / SECURITY_HSTS_ENABLED (CSP + HSTS response headers), MCP_ENABLED / MCP_API_KEY_USER_ID (the MCP tool server is off by default and binds its API key to a real user), BILLING_ENABLED + STRIPE_SECRET_KEY / STRIPE_WEBHOOK_SECRET / STRIPE_PRICE_* (Stripe subscriptions, plans, and quotas), USER_DAILY_TOKEN_LIMIT / USER_MONTHLY_TOKEN_LIMIT (LLM token budget caps, 0 = unlimited; plan entitlements override when billing is enabled), (error tracking with PII scrubbing, backend + frontend). See for all options.
| Command | Description |
|---|---|
make setup | Full setup: venv, deps, .env, encryption key, migrations |
make dev | Start backend (:8000) + frontend (:3100) |
make test | Backend unit tests |
make test-frontend | Frontend vitest |
make test-all | All backend tests (unit + integration) |
make lint | Run ruff linter |
make check | Lint + all tests |
make docker-up | Build and start Docker containers |
make rollout-check | Heroku health snapshot for the M1–M6 flag rollout (config, dyno, /api/health, code_graph_* metrics) |
The project supports multiple deployment targets:
Procfile, heroku.yml, and Dockerfiles included. CI auto-deploys via GitHub Actions. See INSTALLATION.md for setup.docker compose up --build runs backend, frontend, and Redis with health checks..do/app.yaml with secret management.make check # Backend lint + all tests
make test-frontend # Frontend vitest
We welcome contributions! Please read CONTRIBUTING.md for guidelines on setting up the development environment, branch naming, commit conventions, and the pull request process.
This project is licensed under the MIT License.
| Future plans and priorities |
| SECURITY.md | Vulnerability reporting and security measures |
| FAQ.md | Common questions and troubleshooting |
plan_summary event is emitted before query execution, showing the user which tables, rules, and learnings the orchestrator will use, streamed as a compact card in the chat UI that auto-collapses when the answer starts streaming.cohort_window (7/14-day retention/revenue) between query steps with immutable result handlingGitAgent + GitInspector) the orchestrator can call to inspect commits, diffs, blame, releases/tags, authorship, file churn, and commit-trailer review signals on the project's local clone. Available both as single-loop meta-tools (analyze_git, get_release_timeline, write_code_note) and as a first-class analyze_git planner stage. Gated by a fast has_repo capability probe, security-hardened (read-only, explicit arg lists, path-traversal guard, output/count caps, no hooks), with a clone-freshness warning and opt-in auto-pull. Code findings are persisted as code_finding insights and recalled in future questions. Enables the release→cohort recipe: analyze_git → query_database → process_data (cohort_window) → synthesize.llm_call_with_retry helper provides exponential backoff for all LLM calls; LLMAllProvidersFailedError is non-retryable to prevent provider thrash.KnowledgeFreshnessService combines DB-index age, code↔DB sync status, and Git HEAD vs indexed SHA into a single freshness warning surfaced in the orchestrator prompt.record_learning and write_note return JSON outcomes (status: ok|rejected) so the LLM can parse rejection reasons and retry with corrections.learning_analyzer_mode (heuristic | hybrid | llm_first) controls how lessons are extracted from query attempts; the legacy _detect_* rules remain as a fast pre-filter.PREWHERE/WHERE.MetricsCollector records route, complexity, response_type, replans, retries, SQL calls, and wall-clock time per request. Exposed via /metrics (recent rows) and /metrics/prometheus (text exposition format). Also surfaces M2/M5/M6 code-graph counters (code_graph_symbols_total, code_graph_edges_total, code_graph_lineage_refs_total, code_graph_clusters_total).code_graph_enabled): tree-sitter-based extraction of symbols/imports/calls for Python, JS/TS, Go, Java, Ruby, PHP, C#.code_graph_symbols + code_graph_edges with confidence scores.hybrid_retrieval_enabled): BM25 (rank_bm25) ⊕ ChromaDB merged via Reciprocal Rank Fusion in KnowledgeAgent; soft timeouts and single-leg degradation.schema_retrieval_enabled): BM25 over LLM-enriched schema docs picks the right tables for the SQL agent instead of the legacy top-12-by-relevance_score.lineage_enabled): walks the call graph from each ORM entity to discover HTTP endpoints / CLI commands / migrations that read or write the table; the SQL agent gets a "Lineage (top callers)" section per table.clustering_enabled): Louvain communities on the graph; optional LLM labeling (cluster_llm_label_enabled) powers the new get_tables_in_cluster SQL agent tool ("show me the auth tables" → one call).state.code_graph is rehydrated from Postgres via CodeGraphService.load_graph() before M5/M6 run (no silent skips). On project / connection delete, backend/app/services/indexing_artifacts.py performs best-effort, non-throwing cleanup of the on-disk BM25 snapshots and the project's ChromaDB collection (Postgres FK cascades handle the structured rows).KnowledgeFreshnessService.check_staleness() is injected as a KNOWLEDGE FRESHNESS WARNINGS block into both the simple tool-calling loop and the multi-stage pipeline orchestrator messages, so the LLM is told why answers may be stale.KnowledgeAgent._format_entity_detail() renders the top callers from EntityInfo.graph_callers as a "Code lineage (top callers)" section in entity detail responses when lineage_enabled is on.make rollout-check./pricing page, and an in-app billing panel showing plan + usage.tofu default, fail-closed) and pre-command allowlisting, and MCP resources gated by the same principal/ownership checks as MCP tools.frontend/src/lib/motion/tokens.ts; everything degrades gracefully under prefers-reduced-motion and on touch devices. See DESIGN_SYSTEM.md §3.2.SENTRY_DSNbackend/.env.example